检查 SQL 查询是否存在可能的注入的模式是什么?

问题描述 投票:0回答:3

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

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

  • 句子中间的分号——尽管这可能很常见
  • 双破折号/井号用于注释查询的其余部分
  • 在值的开头和结尾使用引号
  • 使用十六进制(我的目标用户在表单中输入 0x 的机会很小到很低)
  • declare/exec/drop/1=1(我的应用程序不应生成这些值)
  • html 标签(来自预期用户/用例的可能性较低)
  • 等等

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

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

sql mysql regex code-injection
3个回答
2
投票

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

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

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

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


1
投票

但是我错过了多少?

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

您最好的选择是:

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

几步却刀枪不入。


0
投票

不可能。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.