Estoy tratando de aprender acerca de las inyecciones de SQL. He creado un formulario de inicio de sesión utilizando PHP (soy bastante nuevo en PHP) como lenguaje de scripts backend y MySQL como DBMS. El último día hice una pregunta sobre las inyecciones de SQL: SQL Injection no funciona cuando creo que debería , y me solucionó algunas dudas, pero ahora tengo nuevas dudas:
Lo que estoy tratando de lograr es omitir el formulario de inicio de sesión que he creado, usando inyecciones de SQL. Este es el script para verificar si el nombre de usuario y la contraseña ingresados pertenecen a un usuario ya registrado (almacenado en la base de datos).
$email = $_POST['u_email'];
$password = $_POST['u_password'];
$query = "SELECT * FROM User WHERE EMAIL='$email' AND PASSWORD='$password'";
$result = $mysqli->query($query);
$counter = mysqli_num_rows($result);
echo "Counter: " . $counter . '<br>';
echo "Query: " . $query;
if($counter == 1)//Correct Login
Tengo que decir que estoy realmente confundido acerca del resultado obtenido al ejecutar las consultas. He creado los siguientes 3 ejemplos en los que en cada uno de ellos inserto diferentes nombres de usuario y contraseña en el inicio de sesión La forma y la verdad es que no entiendo el resultado obtenido de ninguno de los ejemplos, creo que los resultados deberían ser diferentes.
1 Ejemplo: ([email protected] es un correo electrónico existente en la tabla de usuarios)
Input
Username: [email protected]' OR '1'='1/*
Password: */
Output
Counter: 1
Query: SELECT * FROM User WHERE EMAIL='[email protected]' OR '1'='1/*' AND PASSWORD='*/'
¿El valor de la variable $ counter no debería ser 30 (30 es el número de usuarios registrados en la tabla de usuarios)?
Cuando ejecuto la siguiente consulta en la CLI de MySQL:
SELECT * FROM User WHERE EMAIL='[email protected]' OR '1'='1'
Obtengo 30 filas, así que ¿por qué el valor de contador de $ es 1 y no 30?
2 Ejemplo: (xxx NO es un correo electrónico existente en la tabla de usuarios)
Input
Username: xxx' OR '1'='1/*
Password: */
Output
Counter: 0
Query: SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1/*' AND PASSWORD='*/'
¿El valor de la variable $ counter no debería ser 30 (30 es el número de usuarios registrados en la tabla de usuarios)?
Cuando ejecuto la siguiente consulta en la CLI de MySQL:
SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1'
Obtengo 30 filas, así que ¿por qué $ el valor del contador es 0 y no 30?
3 Ejemplo: ([email protected] es un correo electrónico existente en la tabla de usuarios)
Input
Username: [email protected]/*
Password: */
Output
Counter: 0
Query: SELECT * FROM User WHERE EMAIL='[email protected]/*' AND PASSWORD='*/'
¿No debería ser el valor de la variable $ counter 1?
Cuando ejecuto la siguiente consulta en la CLI de MySQL:
SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1'
Obtengo 1 fila, así que ¿por qué $ el valor del contador es 0 y no 1?