我试图针对基于PHP和MySQL的Web应用程序寻找SQL注入的缓解。第一条规则是清理查询;因此我正在使用mysql_real_escape_string()
函数
以下是我的代码段
if (is_string($string)) {
return $mysqli->real_escape_string($string);
} else {
return "";
}
此处,$string
将包含用户输入。在此过滤和转义之后,我将使用INSERT INTO
查询插入数据库。
此过滤器会阻止任何恶意用户输入,例如haha'
,inj''
等,因为is_string()
会检测到这些字符串并应用real_escape_string()
来逃避这些恶意字符。我认为攻击者可以做的唯一可能是使用Numeric有效负载进行SQL注入,但是到目前为止我还不知道任何Numeric有效负载本身已经导致了注入。
那么,这个过滤器会阻止坏人还是可以绕过?
修改: 我知道在生产中启动应用程序时,准备好的语句要好得多,编码也很好。但对于这个问题,我特别想回答任何人如何阻止这个过滤器本身,因为它对我来说似乎很强大!
答案 0 :(得分:-1)
此过滤器将阻止任何恶意用户输入,如haha',inj''
你的想法不过是一种保护。用户输入中没有“恶意”,例如haha',inj'',a really malicious input would contain any of these characters。
也就是说,任何用户输入都是一个字符串,所以你将创建一个臭名昭着的magic quotes feature的嘲弄,非常鄙视并长期从语言中删除。
去准备好的陈述。
答案 1 :(得分:-1)
is_string()
无法防止SQL注入,数字有效负载无论如何都不会导致任何表损坏或不必要的访问,并且字符串清理不能防止所有SQL注入。
我应该告诉你为什么准备好的陈述是惊人的以及所有这些,但你自己表明问题的重点是指出消毒的缺陷
"
等HTML实体的XML文件将更改为“,更改数据)从理论上讲,如果您有类似下面的查询,则清理不会为您节省(borrowed from here)
$ iId = mysql_real_escape_string(“1 OR 1 = 1”);
$ sSql =“SELECT * FROM table WHERE id = $ iId”;