纯mysql预备语句防止注入攻击?

大家都知道,PDO准备声明可以帮助我们防止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如何防止注入攻击?


[我认为你的意思是$ mysqli是mysqli连接。]

尽管执行stmt1(三个查询中的最后一个)是安全的,但您编写的多查询函数非常不安全。 运行类似

userQuery("'; delete from user; select * from user where username='");

实际上会从您的用户表中删除所有用户。 假设$ username表示没有正确转义的原始用户输入,后果可能是灾难性的。

你可以改进上面的内容并使用mysqli :: real_escape_string自己进行转义,但是有许多更复杂的方式可以完成上述的黑客攻击。 准备好的陈述都是更好的解决方案。

链接地址: http://www.djcxy.com/p/16757.html

上一篇: plain mysql prepare statement prevent injection attack?

下一篇: PDO, Prepared statements and SQL