あなたが提供した SQL クエリはどれも、実際には SQL インジェクションに対して脆弱ではありません。
SQL 入力が適切にエスケープされないため、SQL インジェクションの脆弱性が発生します。
例えば:
$sql = "select * from users where user_id =" . $_GET['user_id'];
以下を渡したかどうかを検討してください。
http://some_server.com/some_page.php?user_id=123%20or%201=1
実行時のクエリは次のようになります。
select * from users where user_id = 123 or 1=1
これを修正するには、パラメーター化されたクエリを使用します。
$query = "select * from users where user_id = ?"
user_id 値をクエリにバインドすると、データ アクセス レイヤーは入力文字列を適切にエスケープし、次の処理が実行されます。
select * from users where user_id = '123 or 1=1' which would not return any rows, preventing the injection
PHP と mysql 拡張機能を使用している場合:
$sql = "select * from users where user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'";
SQL クエリに入るすべての入力をエスケープする必要があることに注意してください。
$sql = "select id_column from some_table where id = 1";
$stmt = mysqli_query($conn, $sql);
if($stmt === false) die(mysqli_error($conn) . "\n");
while($row = mysqli_fetch_assoc($conn, $stmt) {
$sql = "update some_other_table set some_value = 'new value' where some_column = '" . mysqli_real_escape_string($conn, $row['id_column']) . "'";
....
}
これは、データベースから選択した値に、"O'Hara" という名前や例など、SQL ステートメントで実行するのに安全ではない文字が含まれている可能性があるためです。}