如何"参数化查询/准备好的陈述" SQL注入比逃避用户输入更好

时间:2017-12-05 04:51:48

标签: php mysql sql

有许多articles告诉使用parametrized queries代替escaping user input。但没有显示任何例子。我想知道一个真实的例子,其中“参数化查询/准备语句”阻止SQL注入,而逃避用户输入则不能。您是否可以举例说明parameterized query在查询的用户输入仍然包含特殊字符造成损害时阻止SQL注入攻击?例如,parameterized queries可以处理但escaping user input无法处理的查询

查询like = ' or 1=1-- //我想知道是否有类似的查询"参数化查询/准备好的语句"可以防止SQL注入,但是"逃避用户输入"可'吨

1 个答案:

答案 0 :(得分:0)

问:你能给出一个例子,当用户对查询的输入仍然包含一个特殊字符造成伤害时,参数化查询会阻止SQL注入攻击吗?

答:代码中存在一些多字节字符漏洞,但没有正确考虑字符集,导致转义机制出现漏洞。 (其中“转义字符串”认为它正在处理特定编码的字符串,但实际字节采用不同的编码,并且偷偷地将单引号滑入SQL文本。)

但我并不认为这是使用绑定占位符的预准备语句的最强参数。

一个强有力的论据是,当我们查看代码时,我们会看到 static SQL文本,而不是动态生成的......

 $sql = 'SELECT fee, fi FROM fo WHERE fum = ?'; 
 $dbh->prepare($sql);

我们看到了这些代码,我们看看那个SQL文本......我们立即认识到,没有的方式使SQL文本不是我们所看到的。我们不必查看代码中的任何其他内容;我们在两条线上看到它。

当我们看到这个时:

 $sql = "SELECT fee, fi FROM fo WHERE fum = $fumval";

这是双引号,正在进行变量解释。 $fumval是否保证安全包含在SQL文本中,$fumval来自哪里?应该在$ fumval附近有单引号,还是我们保证它已经用单引号括起来了?

好吧,也许在此之前就有一条线:

 $fumval = $dbh->quote($unsafe_fumval);

如果该行不在SQL文本生成之上,我们需要检查...我们是否保证$ fumval是安全的?

重点是...... SQL正在动态构建。如果这样做可能会更好:

$sql = 'SELECT fee, fi FROM fo WHERE fum = ' . $dbh->quote($unsafe_fumval);

对于一个简单的陈述,也许它是六个中的六个,另外六个。但是当SQL语句变大,涉及多个表和几十个列引用和值时,动态构造变得更难以验证中存在任何问题。

是否可以使用动态生成的SQL和值上的“转义字符串”处理来编写安全代码? YES。

是否可以编写使用带有动态生成的SQL文本的预准备语句的易受攻击的代码? YES。

它实际上是静态 SQL文本的模式,通过绑定占位符提供的值传递让我们感到震惊...代码写在一个我们可以识别出易受SQL注入攻击的方式。