假设登录表单调用的sql查询是:
SELECT * FROM Users WHERE Name ='user input data' AND Pass ='user input data'
现在,用户输入数据中的所有单引号都被双引号替换(换句话说,'被替换为''。)。
我可以想到这个可能的sql注入:将用户设置为目标用户并将密码设置为' \'或1 = 1
但是我无法想到我将如何避免最后一次'从破坏我的SQL注入。
答案 0 :(得分:0)
避免最后'
中断SQL注入就像使用注释一样简单,例如(--
非常适合单行SQL)。或者,您可以随时添加以下内容:
someHack and '' = '
现在,是否有可能绕过您的单引号来双重替换?这很可能在很大程度上取决于您使用的实际SQL变体和SQL引擎。例如,某些SQL引擎可能会以一种给您带来麻烦的方式处理输入中的结束行为。 Unicode很可能会给你带来麻烦,因为它的规则非常复杂。特别是,如果代码的某些部分是unicode,而其他部分则不是,那么将无害的unicode字符传递给需要ASCII的人,并且实际上使用你的替代品来添加(未转义的)很容易引用。如果你认为这是一个奇怪的边缘情况,它实际上是一个非常真实和使用的SQL注入向量的PHP程序员谁认为replace
(或addslashes
)足以防止SQL注入:D
如果可能,请尝试使用参数而不是将文本一起打包。它也可能有助于你的性能:)避免解析器错误的最简单方法是避免使用解析器。