正则表达式检测基本 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 注射器还有另外三个原因。
- 我们有很多脚本小子试图攻击我们。其中大部分是
已经至少被阻止一次,因为我们有一个文件扩展名
白名单系统会在他们尝试时阻止其中的大部分
请求 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 注入,提出问题的人回答说他们不会使用正则表达式来停止,而只是为了检测,然后是一堆无用的评论。
那么,这样的正则表达式是否有可能只作为一种检测手段工作,误报率最低,或者这是一个完整的兔子,不值得付出努力吗?
这个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
首先让我说,我是我为确保 SQL 注入攻击失败而采取的措施的知己。所有 SQL 查询值都是通过活动记录准备语句完成的,所有运算符(如果不是硬编码)都是通过数字白名单系统完成的。这意味着如果有人想通过 "ILIKE" 进行搜索,他们会传递 6,如果他们想通过“=”进行搜索,他们会传递 1,等等
我也经常使用 Brakeman and the 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 注入,提出问题的人回答说他们不会使用正则表达式来停止,而只是为了检测,然后是一堆无用的评论。
那么,这样的正则表达式是否有可能只作为一种检测手段工作,误报率最低,或者这是一个完整的兔子,不值得付出努力吗?
这个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