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?