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」が true と評価されるため、パスワード フィールドからの入力を受け入れることです。実際には、テーブルの最初のエントリであるユーザー名 JBloggs の結果が返されます。これは私が理解していないビットです。
この動作を引き起こしているコードまたはロジックの障害を指摘できる人はいますか?