我创建了一个测试站点,以便了解 SQLi 并加以防范。我可能会误解它应该如何表现,但目前我没有得到我期望的结果。
这页纸:
<!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>
数据库中的表:
http://imgur.com/FvIbCuz(似乎无法发布图片)
输入:
username: admin
password: ' OR '1'='1
我的期望是它会找到管理员用户,然后接受来自密码字段的输入,因为 '1'='1 应该评估为真。它实际上返回表中第一个条目的结果,用户名 JBloggs。这是我不明白的一点。
谁能指出导致这种行为的代码或逻辑错误?