首页 文章

普通的mysql准备语句防止注入攻击?

提问于
浏览
-4

每个人都知道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 回答

  • 2

    [我假设你的意思是$ mysqli是mysqli连接 . ]

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

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

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

    您可以使用mysqli :: real_escape_string来改进上面的内容并自行进行转义,但是有很多更复杂的方法来执行上面的黑客攻击 . 准备好的陈述都是更好的解决方案 .

相关问题