使用is_string()是一个很好的防御SQL注入?

时间:2018-03-11 20:21:25

标签: php mysql sql-injection

我试图针对基于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有效负载本身已经导致了注入。

那么,这个过滤器会阻止坏人还是可以绕过?

修改: 我知道在生产中启动应用程序时,准备好的语句要好得多,编码也很好。但对于这个问题,我特别想回答任何人如何阻止这个过滤器本身,因为它对我来说似乎很强大!

2 个答案:

答案 0 :(得分:-1)

否:PHP delusion #1: Mysql(i)_real_escape_string prevents SQL injection

  

此过滤器将阻止任何恶意用户输入,如haha',inj''

你的想法不过是一种保护。用户输入中没有“恶意”,例如haha',inj'',a really malicious input would contain any of these characters

也就是说,任何用户输入都是一个字符串,所以你将创建一个臭名昭着的magic quotes feature的嘲弄,非常鄙视并长期从语言中删除。

去准备好的陈述。

答案 1 :(得分:-1)

NO

is_string()无法防止SQL注入,数字有效负载无论如何都不会导致任何表损坏或不必要的访问,并且字符串清理不能防止所有SQL注入。

我应该告诉你为什么准备好的陈述是惊人的以及所有这些,但你自己表明问题的重点是指出消毒的缺陷

为什么要使用准备好的陈述而不是消毒

  1. 在某些情况下,您需要在数据库中使用未经过数据处理的数据,例如:特殊格式的文本(如LaTeX,XML或JSON),您需要对数据进行去清理,这不是100%的准确性保证(例如,包含"等HTML实体的XML文件将更改为“,更改数据)
  2. 预备语句可以重新绑定并在极少数行中执行
  3. 从理论上讲,如果您有类似下面的查询,则清理不会为您节省(borrowed from here)

    $ iId = mysql_real_escape_string(“1 OR 1 = 1”);
    $ sSql =“SELECT * FROM table WHERE id = $ iId”;