每个人都知道PDO prepare语句可以帮助我们防止SQL注入攻击 . 这个怎么样:
function userQuery($username){
$mysqli->multi_query("
PREPARE stmt1 FROM 'SELECT * FROM user WHERE username=?';
SET @a = '$username';
EXECUTE stmt1 USING @a
");
}
userQuery('Kelvin');
这和mysqli或PDO准备声明一样安全吗?
我问这个问题,因为我在wiki找到了这些句子:
准备语句对SQL注入具有弹性,因为以后使用不同协议传输的参数值无需正确转义 . 如果原始语句模板不是从外部输入派生的,则不能进行SQL注入 .
他们提到 parameters are transmitted later with different protocol
. 我真的不明白这一点 .
parameters are transmitted later with different protocol
如何防止注射攻击?
1 回答
[我假设你的意思是$ mysqli是mysqli连接 . ]
尽管执行stmt1(三个查询中的最后一个)是安全的,但您编写的多查询函数非常不安全 . 运行类似的东西
实际上会删除用户表中的所有用户 . 假设$ username表示没有正确转义的原始用户输入,后果可能是灾难性的 .
您可以使用mysqli :: real_escape_string来改进上面的内容并自行进行转义,但是有很多更复杂的方法来执行上面的黑客攻击 . 准备好的陈述都是更好的解决方案 .