我们发现我们的一台服务器上有大量引荐垃圾邮件,因此我决定添加一些自定义 modsecurity 规则来尝试阻止其中至少一些。
我添加了几条规则,例如:
SecRule REQUEST_HEADERS:User-Agent "/\byourekillingme.org\b/" \
"phase:1,log,deny,status:503,msg:'Referer spam1',id:101"
SecRule REQUEST_HEADERS:User-Agent "/\bahrefs.com/robot\b/" \
"phase:1,log,deny,status:503,msg:'Referer spam2',id:102"
SecRule REQUEST_HEADERS:User-Agent "/\bsemrush.com/bot\b/" \
"phase:1,log,deny,status:503,msg:'Referer spam6',id:106"
但是从日志输出中可以看出,虽然应用了 ahrefs 规则(上面的 id 102),但其他规则并未应用(还有其他规则,但只有 ahrefs 有效):
107.180.120.23 - - [23/Nov/2017:11:08:00 +0000] "GET /tri-levlen-28-side-effects-3f1 HTTP/1.1" 200 50965 "http://www.mydomain.co.uk/tri-levlen-28-side-effects-3f1#elephant" "WordPress/4.9; http://yourekillingme.org"
51.255.65.42 - - [23/Nov/2017:10:40:51 +0000] "GET /pink-viagra-price-52c HTTP/1.1" 503 315459 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.2; +http://ahrefs.com/robot/)"
46.229.168.73 - - [23/Nov/2017:11:07:50 +0000] "GET /viagra-for-sale-online-cheap-52c HTTP/1.1" 200 51060 "-" "Mozilla/5.0 (compatible; SemrushBot/1.2~bl; +http://www.semrush.com/bot.html)"
我还检查了 /usr/local/apache/logs/modsec_audit.log 以确认是我的规则导致了 503 而不是其他地方的其他规则,并且只显示了很多条目:
Message: Access denied with code 503 (phase 1). Pattern match "/\\bahrefs.com/robot\\b/" at REQUEST_HEADERS:User-Agent. [file "/usr/local/apache/conf/modsec2.myrules.conf"] [line "8"] [id "102"] [msg "Referer spam2"]
这表明是我的 modsec 规则阻止了它。
有人能知道为什么我的其他规则没有被应用吗?
答案1
是斜杠。ModSecurity 中的正则表达式不受斜杠的限制,因此斜杠被解释为正则表达式的文字部分。
所有表达式都是匹配的 URL,因此第一个斜杠与http://
URL 部分的最后一个斜杠匹配,但只有 AHrefs URL 有一个尾随斜杠,因此它是唯一一个最终与这些正则表达式匹配的 URL。
我也不确定这\b
是否有什么用处。它似乎匹配字符串末尾的这三个.
。/
如果 ModSecurity 确实理解了它,则可能会导致其他机器人的未来表达式在您期望它们匹配时无法匹配。