Php 普通mysql prepare语句防止注入攻击?

Php 普通mysql prepare语句防止注入攻击?,php,prepared-statement,Php,Prepared Statement,大家都知道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('Kel

大家都知道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 prepare语句一样安全吗

我问这个问题是因为我发现以下句子:

准备好的语句对SQL注入具有弹性,因为稍后使用不同协议传输的参数值不需要正确转义。如果原始语句模板不是从外部输入派生的,则无法进行SQL注入

他们提到的
参数稍后会通过不同的协议传输。我真的不明白
这个


以后如何使用不同的协议传输
参数
以防止注入攻击?

[我假设您的意思是$mysqli是mysqli连接。]

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

userQuery("'; delete from user; select * from user where username='");
将实际删除用户表中的所有用户。假设$username表示未经正确转义的原始用户输入,则后果可能是灾难性的


您可能会改进上面的内容,并使用mysqli::real_escape_string自己进行转义,但是有很多更复杂的方法来进行上面的攻击。预先准备好的语句总的来说是一个更好的解决方案。

请思考注入攻击是如何工作的,然后将相同的逻辑应用到上述场景中。我已经更新了我的问题。如果我在什么地方仍然错了,请告诉我。谢谢你的回答。顺便说一句,你的意思是,如果我将我的多个查询分离为单个查询,它会是安全的吗?如果你这样做(不确定这是否可行),你的集合@a=。。。仍将具有相同的属性。如果您想使用mysqli安全地执行此操作,请查看以下答案:。至于您的问题更新:准备语句的工作方式与正常语句的工作方式略有不同。与您的查询不同,您的查询与您注入的参数一起传输到服务器,然后被编译、执行和丢弃,您准备好的语句查询首先使用参数占位符传输到服务器。在那里它被编译,仍然只有参数占位符。然后,该语句就可以执行了。在执行时,参数值被注入到已编译的查询中,因此我向您演示的技巧不会有任何效果。如果您需要了解协议细节,请查看,这两个部分中的一个应该回答您的所有问题。