La inyección SQL no devuelve los resultados esperados

5

He creado un sitio de prueba para aprender sobre SQLi y luego protegerme contra él. Puede que no entienda bien cómo se supone que se comporte, pero en este momento no estoy obteniendo los resultados que espero.

La página:

<!DOCTYPE html>
<html><body>

<h1>SQL Injection Test Site</h1>
<h2>Login Form</h2>

<form action="" method="post">
Username: <input type="text" name="username">
Password: <input type="text" name="password">
<input type="submit"></form>

<?php
$db = mysql_connect(***, ***, ***); 
if(!$db){ 
    die('Could not connect: ' . mysql_error()); 
}else{
    mysql_select_db(***);  
}

if(isset($_POST["username"]) && isset($_POST["password"])){
    $username = $_POST["username"];
    $password = $_POST["password"];
    $result = mysql_query("SELECT * FROM customer_data 
                            WHERE username = '$username' 
                               AND password = '$password'");
    $result = mysql_fetch_assoc($result);
    //we would now process the login if details matched
    echo "Logged in: " . $result['username'];
    var_dump($result);
}
?>

</body></html>

La tabla en la base de datos:

La entrada:

username: admin
password: ' OR '1'='1

Mi expectativa es que encuentre al usuario administrador y luego acepte la entrada del campo de contraseña como '1' = '1 debe evaluar como verdadero. En realidad, devuelve el resultado de la primera entrada en la tabla, nombre de usuario JBloggs. Esto es lo que no entiendo.

¿Alguien puede señalar un error en el código o la lógica que está causando este comportamiento?

    
pregunta Scott Helme 21.07.2013 - 14:08
fuente

1 respuesta

2

No hay falla en el código. Está utilizando la condición O . Para la primera fila que tiene los datos del usuario JBloggs, el nombre de usuario no es admin, pero 1 = 1 es válido para el primer registro. Dado que las dos condiciones tienen un OR entre ellas, cualquier condición verdadera hará que toda la afirmación sea verdadera, por eso está obteniendo el registro de la primera fila.

    
respondido por el void_in 21.07.2013 - 14:24
fuente

Lea otras preguntas en las etiquetas