在 SQL 查询中检查可能的注入的模式是啥?

Posted

技术标签:

【中文标题】在 SQL 查询中检查可能的注入的模式是啥?【英文标题】:What pattern to check on an SQL query for possible injection?在 SQL 查询中检查可能的注入的模式是什么? 【发布时间】:2018-06-30 13:32:37 【问题描述】:

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

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

句子中间的分号 -- 虽然这可能很常见 双破折号/井号用于评论查询的其余部分 在值的开头和结尾使用引号 使用十六进制(我的目标用户在他们的表单中输入 0x 的机会很小甚至很低) declare/exec/drop/1=1(我的应用不应生成这些值) html 标签(来自预期用户/用例的可能性很小) 等

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

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

【问题讨论】:

使用参数。那你就不用担心SQL注入了。 答案与您链接中的答案相同:“不要这样做。您实际上肯定会失败。请改用 PreparedStatement(或其等效项)。” 我不太担心注射。我想知道是否有任何用户尝试“注入”应用程序。 【参考方案1】:

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

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

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

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

【讨论】:

我遵循规则 1。但这不是重点。我想做的是记录那些试图进行sql注入的人,所以我想根据一些已知的注入模式检查输入,这样我就可以标记这些用户;检查输入有点太麻烦了,因为在清理之前的双循环中,而查询检查更简单,因为我可以在查询执行之前/之后挂钩。【参考方案2】:

但我错过了多少?

你猜对了。创建一个巨大的黑名单不会让你的代码免疫。这种方法已成为历史。其他问题也遵循同样的思路。

您最好的选择是:

验证输入数据(输入不一定来自外部) 使用准备好的语句。

步骤少但防弹。

【讨论】:

我不想将查询列入黑名单。我想知道是否有任何用户正在尝试。 这叫黑名单。 我在想黑名单会使应用程序拒绝查询。无论如何,查询,尤其是类似 description 的文本输入不会拒绝用户的输入,但我希望应用程序记录用户编写这种输入。而且,是的,所有输入都对查询本身使用准备好的语句和参数绑定。【参考方案3】:

不可能。

你将在军备竞赛中度过余生——你建立防御,他们制造更好的武器,然后你建立防御,等等。

可能编写一个需要 24 小时才能运行的“简单”SELECT。 除非您锁定表,否则它们可以查看加密密码并使用root 登录重新攻击。 如果您允许使用任何类型的字符串,则处理各种引用组合将是一个挑战。 使用半有效的 utf8 字符串可以做一些令人讨厌的事情。 那么SET 语句呢。 还有LOAD DATA。 和存储过程。

相反,确定您允许的最小查询集,然后对其进行参数化,以便您可以单独检查或转义各个部分。然后构建查询。

【讨论】:

以上是关于在 SQL 查询中检查可能的注入的模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

sql 注入是啥?

SQL 注入

delphi sql查询

商店搜索中的 SQL 注入模式

SQL注入攻击

SQL注入——mysql注入原理与注入检查