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

Regex To Detect Basic SQL Injections, But Not As A Means to Prevent SQL Injections

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

我也经常使用 Brakeman and the Rails SQL Injection guide 来检查代码。

所以我想阻止尝试的 SQL 注射器还有另外三个原因。

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

目前我的想法是 运行 对请求路径和参数进行简单的正则表达式匹配,以标记最明目张胆的 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 注入,提出问题的人回答说他们不会使用正则表达式来停止,而只是为了检测,然后是一堆无用的评论。

那么,这样的正则表达式是否有可能只作为一种检测手段工作,误报率最低,或者这是一个完整的兔子,不值得付出努力吗?

这个link应该给你开始的模式。

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