Php 普通mysql prepare语句防止注入攻击?
大家都知道PDO prepare语句有助于防止SQL注入攻击。这个怎么样: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
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安全地执行此操作,请查看以下答案:。至于您的问题更新:准备语句的工作方式与正常语句的工作方式略有不同。与您的查询不同,您的查询与您注入的参数一起传输到服务器,然后被编译、执行和丢弃,您准备好的语句查询首先使用参数占位符传输到服务器。在那里它被编译,仍然只有参数占位符。然后,该语句就可以执行了。在执行时,参数值被注入到已编译的查询中,因此我向您演示的技巧不会有任何效果。如果您需要了解协议细节,请查看,这两个部分中的一个应该回答您的所有问题。