0

Saludos estoy tratando de migrar mis script a consultas preparadas pero aun estoy adaptándome a ese nuevo estilo de hacer las cosas, dejaré el script que da acceso a los usuarios a mi aplicación:

// LOGIN USER
function login(){
    global $db, $username, $errors, $nombrepag;

    // grap form values
    $username = e($_POST['username']);
    //$email = e($_POST['email']);
    $password = e($_POST['password']);

    // make sure form is filled properly
    if (empty($username)) {
        array_push($errors, "Su Numero de Usuario o Correo Electronico es Requerido<br>");
    }
    if (empty($password)) {
        array_push($errors, "Su Contraseña de Acceso es Requerida<br>");
    }

    // attempt login if no errors on form
    if (count($errors) == 0) {
        $password = md5($password);

    $query = "SELECT * FROM users WHERE (username='$username' OR email='$username') AND password='$password' LIMIT 1";
        $results = mysqli_query($db, $query);

        if (mysqli_num_rows($results) == 1) { // user found
            // check if user is admin or user
            $logged_in_user = mysqli_fetch_assoc($results);

            $id_usuario = $logged_in_user['id'];


            if ($logged_in_user['user_type'] == 'admin') {

        $_SESSION['user'] = $logged_in_user;
        $_SESSION['success']  = "Favor Espere";
        $where = $_SESSION['here'];
        if (!empty($where)) {
          header ("Location: $where");
   } else {
          header('location: admin/home.php');
   }

                //$origen= $_SERVER["HTTP_REFERER"];
                //header('location:'.$origen);
            }else{
                $_SESSION['user'] = $logged_in_user;
        $_SESSION['success']  = "Favor Espere";
        $where = $_SESSION['here'];
        if (!empty($where)) {
          header ("Location: $where");
   } else {
          header('location: usuario/home.php');
   }

            }

           visita();

        }else {
            array_push($errors, "Combinación incorrecta de nombre de usuario/contraseña");
        }
    }
}

Intente haciendo algo como esto

$login = $db->prepare("SELECT * FROM users WHERE (username='?' OR email='?') AND password='?' LIMIT 1");
      $login->bind_param("sss",$username, $username, $password);
      $login->execute();
      $result = $login->get_result();
      $nrl = $result->num_rows;
      if($nrl === 0) exit('Ha ocurrido un error inesperado, intente mas tarde.');

Pero la verdad no logro terminar de comprender la lógica de como hacer las consultas preparadas, he leído varios ejemplos pero siempre me encuentro con el debate que mejor es PDO o que MySQLi ha solucionado el problema de vulnerabilidad de MySQL, etc, etc, imagino que muchos de acá dominan este tema y espero puedan brindarme luces al respecto..!

DjCrazy
  • 4,786
  • 3
  • 13
  • 33
Jose M Herrera V
  • 1,026
  • 8
  • 22
  • checa estas respuestas de la misma comunidad te serán útiles: https://es.stackoverflow.com/questions/18232/c%C3%B3mo-evitar-la-inyecci%C3%B3n-sql-en-php/18233#18233 – BetaM Jun 01 '19 at 13:44
  • y esta https://es.stackoverflow.com/questions/10518/qu%C3%A9-es-la-inyecci%C3%B3n-sql-y-c%C3%B3mo-puedo-evitarla/10519#10519 – BetaM Jun 01 '19 at 13:44

1 Answers1

0

La idea en general es definir dónde y qué valor(es) utilizar, el dónde lo defines mediante marcadores de posición y dependiendo de la librería habrá manera de vincular (bind), es decir, indicarle cuál valor (y tal vez su tipo) utilizar en cierto marcador de posición.

El concepto de prepared statements existe desde antes que preocuparan las inyecciones de SQL, en distintos lenguajes y para distintos manejadores de base de datos y cada implementación tendrá sus diferencias, ninguna es mejor que otra, todo depende del contexto, así que mas vale irse acostumbrando a la diversidad.

Lo que sí está claro entre PDO y mysqli, es que el primero pretende un uso más generalizado y el segundo -desde su mismo nombre- es mas especializado. "El que mucho abarca, poco aprieta", "El que más aprieta, poco abarca" análogo al principio de física presión-superficie. Reitero, depende del contexto: el programador y su experiencia, el problema, el hardware, objetivos a corto o largo plazo, etc..

Sal
  • 6,626
  • 1
  • 7
  • 17