正则表达式检测基本 SQL 注入,但不能作为防止 SQL 注入的手段

Posted

技术标签:

【中文标题】正则表达式检测基本 SQL 注入,但不能作为防止 SQL 注入的手段【英文标题】:Regex To Detect Basic SQL Injections, But Not As A Means to Prevent SQL Injections 【发布时间】:2015-09-09 18:13:46 【问题描述】:

首先让我说我是我为确保 SQL 注入攻击失败而采取的措施的知己。所有 SQL 查询值都是通过活动记录准备语句完成的,所有运算符(如果不是硬编码)都是通过数字白名单系统完成的。这意味着如果有人想通过“ILIKE”进行搜索,他们会通过 6,如果他们想通过“=”搜索,他们会通过 1,等等。

我还经常使用Brakeman 和Rails SQL Injection guide 来审查代码。

因此,我想阻止尝试的 SQL 注入器的剩余三个原因。

    我们有很多脚本小子试图破解我们。其中大部分是 已经至少被阻止一次,因为我们有一个文件扩展名 白名单系统,当他们试图阻止其中大部分 请求一个 php 文件。曾经虽然他们被列入黑名单 第一次,在第二轮,他们通常会尝试抛出 SQL 我们的注射书。所以我想早点标记这些孩子 节省带宽,如果一个真正的演员在哪里攻击我们,那就是 很容易从所有脚本小子中找出它们。 减缓任何探查我们防御的尝试。这真的不会 影响复杂的分布式攻击,但可能会减慢 介于脚本小子和超级黑客之间的演员。 标记所有被阻止的请求并设置我们的日志通知 然后我们的日志服务会通知我们,以增加我们的 安全意识。

目前我的想法是针对请求路径和参数运行一个简单的正则表达式匹配,以标记最公然的 SQL 注入尝试并将这些 ip 列入黑名单,所以像这样,使用 rack-attack。

injection_regex = /SOMEREGEXHERE/

Rack::Attack.blacklist('sql injection blacklist') do |req|
  Rack::Attack::Fail2Ban.filter(req.ip, :maxretry => 5, :findtime => 10.minutes, :bantime => 24.hours) do
    CGI.unescape(req.query_string).match(injection_regex) || req.path.match(injection_regex)
  end
end

虽然我的问题是创建一个正确标记简单 SQL 注入尝试的正则表达式,但不会对普通用户造成任何问题。我认为一些误报是可以的,这就是为什么上述黑名单系统在第一次匹配后没有列入黑名单的原因。

在我的搜索中,我发现了一些关于这个主题的问题,但他们似乎都去like this one,有人问关于使用正则表达式检测 SQL 注入的问题,另一个人回答你不应该停止 SQL 注入这个方式,提出问题的人回答说他们不会使用正则表达式来停止,而只是为了检测,然后一堆无用的 cmets 随之而来。

那么,这样的正则表达式是否有可能仅作为一种检测手段发挥作用,并且误报率极低,或者这是一个不值得努力的兔子整体?

【问题讨论】:

我确信在某种程度上这是可能的。不过,开始的地方是将您想要查找的内容放在一起。获得该列表后,您就可以创建一个模式来查找它们。 你看过this吗?您的问题的一种解决方案可能是使用输入通过的这些正则表达式创建多个级别。如果任何级别匹配这是一个警告。 【参考方案1】:

此链接应该为您提供开始使用的模式。

http://larrysteinle.com/2011/02/20/use-regular-expressions-to-detect-sql-code-injection/

文本块

'(''|[^'])*'

SQL 语句

\b(ALTER|CREATE|DELETE|DROP|EXEC(UTE)0,1|INSERT( +INTO)0,1|MERGE|SELECT|UPDATE|UNION( +ALL)0,1)\b

【讨论】:

以上是关于正则表达式检测基本 SQL 注入,但不能作为防止 SQL 注入的手段的主要内容,如果未能解决你的问题,请参考以下文章

防止sql注入的方法

正则表达式防止 sql/脚本注入

怎样防止sql注入

如何防止sql注入

防止SQL注入和XSS注入的方法总结

PHP中防止SQL注入