你想要这样的东西:
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/ ,方法是 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
用block,setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}
which 在稍后检查分数时会产生相同的效果,但在我看来不必要地使规则的可读性复杂化,因为它总是会阻塞。
这篇博客文章更详细地介绍了异常评分与传统评分:http: //blog.modsecurity.org/2010/11/advanced-topic-of-the-week-traditional-vs-anomaly-scoring-detection-modes .html