下面的代码是否更好地防止MySQL数据库上的SQL注入比mysqli_real_escape_string
更好?
$str = "SELECT * FROM customers WHERE username = '; DELETE FROM customers WHERE 1 or username = '";
$str2 = "";
for($i = 0; $i < strlen($str); $i++)
{
if (strpos ("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!0123456789", $str[$i], 0) !== FALSE)
{
$str2 = $str2 . $str[$i];
}
}
echo "$str2";
答案 0 :(得分:9)
绝对没有理由在尝试避免SQL注入时使用白名单/黑名单。在没有预处理语句的情况下使用mysqli_
函数时,您需要做的就是使用mysqli_real_escape_string()
处理数据。
但是,您最好不要学习prepared statements。它们比逃避更清洁,更安全。
使用预准备语句执行示例查询的代码如下所示:
$stmt = $conn->prepare('SELECT * FROM customers WHERE username = ?');
$stmt->bind_param('s', $username);
$result = $stmt->execute();
由于你不理解这个例子,这里有一个详细的解释:
?
。s
)参数。因此$username
应包含(不受信任的)值答案 1 :(得分:2)
下面的代码是否比mysqli_real_escape_string更能防止mysql注入,还是无关紧要?
都不是。情况更糟,你不应该这样做!你没有逃避(!)数据(!!),而是破坏了整个查询。
简而言之,它将
即使您只是对数据应用方法,也不对整个查询应用,
答案 2 :(得分:1)
阅读this article。在用户评论的底部,您会发现许多有用的SQL注入预防技巧和提示。 但是,第一步是在将数据插入查询之前验证和清理您的GET / POST数据。