你想要这样的东西:
SecRule REQUEST_URI "@streq /secure/bla/test/etc/" \
"phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase"
您需要将两个规则链接在一起,因为您想检查两个条件(路径为 /secure/bla/test/etc/and方法为 GET)。
如果您想添加第三条规则来检查主机(例如,如果您有多个虚拟主机,并且此 URL 对于其中一些虚拟主机的 GET 请求有效),那么您可以:
SecRule REQUEST_URI "@streq /secure/bla/test/etc/" \
"phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase,chain"
SecRule SERVER_NAME "@streq www.example.com"
或者您可以使用 REQUEST_URI_RAW ,其中包括协议和主机名以及请求的资源:
SecRule REQUEST_URI_RAW "^https?://www.test.com/secure/bla/test/etc/" \
"phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase"
您会注意到我还添加了很多转换函数(t:
位)来帮助避免人们试图绕过这个规则(例如使用像这样的路径/secure/bla/TEST/../test/etc/
).
所有这些都包含在参考手册中:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual但我承认确实需要一些练习才能习惯!
异常检测模式简单意味着可能触发有效请求的规则不会立即阻止,而是分配一个分数,如果该请求的所有规则的总分数高于某个阈值,则它会阻止,否则不会阻止。这允许仍然包含“嘈杂”规则,但会被忽略,除非大量嘈杂规则都针对某个请求触发,或者如果触发了一个重要规则。
没有什么可以阻止您使用“拒绝”选项显式阻止,就像我上面所做的那样 - 即使在异常检测模式下也是如此。这条规则似乎相当安全,不会因合法请求而意外触发(一旦你测试过它就有效!),所以我会像上面所做的那样直接阻止。替代方案是替换deny
with block,setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}
当稍后检查分数时,这将具有相同的效果,但在我看来,不必要地使规则的可读性复杂化,因为无论如何它总是会阻塞。
这篇博文更详细地介绍了异常评分与传统评分的比较:http://blog.modsecurity.org/2010/11/advanced-topic-of-the-week-traditional-vs-anomaly-scoring-detection-modes.html