首页 > 解决方案 > 在 SQL 查询中检查可能的注入的模式是什么?

问题描述

我想通过检查 SQL 查询来检测可能的 SQL 注入攻击。我正在使用 PDO 和准备好的声明,所以希望我没有被别人攻击的危险。但是,我要检测的是输入/结果查询字符串可能成为危险查询的可能性。例如,我的应用程序——正确地——永远不会生成“1=1”查询,所以我可以检查生成的查询字符串,并标记产生该查询的用户/IP。与“drop table”相同,但也许我只能通过循环输入数组来检查;或者也许我应该重新检查生成的查询。我正在使用 MySQL,但其他驱动程序的模式也很受欢迎。

我已经阅读了 RegEx to Detect SQL Injection并且一些评论正朝着这个方向发展。在我的帮助下,我正在为很少使用英语作为输入的用户进行开发,因此查询上的简单 /drop/ 匹配可能足以记录用户/查询以供进一步检查。我在研究 SQL 注入时发现的一些模式是:

通过在生成查询字符串之前循环输入值,上述所有内容都更容易检测到,因为它们没有被转义。但我错过了多少?(很多,我猜)我应该检查任何其他晦涩的模式吗?检查生成的查询怎么样?任何可能出现的模式?

tl;dr:什么模式可以匹配 SQL 查询(MySQL)来检查可能的注入?我将 PDO 与准备好的语句和值绑定一起使用,因此该检查用于日志记录/警报目的。

标签: mysqlsqlregexdesign-patternscode-injection

解决方案


在我的商店里,我们有两条规则。

  1. 始终在 SQL 查询中使用参数。
  2. 如果由于某种原因您不能遵循规则一,则必须对放入查询的每条数据进行清理,使用intval()整数参数或适当的函数来根据其应用程序数据类型清理字符串变量。例如,个人名称可能是Jonesor O'BrienSt. John-Smythe但绝不会包含除撇号'、连字符-、空格或点之外. 的特殊字符 产品编号可能仅包含字母或数字。等等。

如果 2 太难,请遵循规则 1。

我们检查代码以确保我们正在做这些事情。


推荐阅读