您提供的所有 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']) . "'";
....
}
这是因为您从数据库中选择的值可能包含在 SQL 语句中执行不安全的字符,例如名称“O'Hara”或示例。}