所以这是这个问题的延续:modsecurity 创建规则禁用 GET 请求 https://stackoverflow.com/questions/39980992/modsecurity-create-rule-disable-get-request/39983843
example GET /secure/test/bla/bla/ example
https://bla.bla.com/secure/test/bla/bla?www.test.com
我不懂这啥意思。你能把它改写得更有意义吗?您是说 URL 将包含另一个域吗?
您给出的例子有几个问题。例如这部分:
"@streq \/secure\/test\/bla\/bla\?.+"
The @streq
意味着这是一个直接的字符串比较。所以你不能使用?.+
部分 - 我猜这看起来是正则表达式的一部分?如果您想要正则表达式,那么这是默认的,所以不要包含@streq
bit:
"\/secure\/test\/bla\/bla\?.+"
我也不认为你需要逃避正斜杠,但这样做应该没有什么坏处。
你还有这个:
SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"
你为什么要检查post当你想阻止时get要求?
在第二条规则中我需要添加“@rx吗?”!@rx和@rx之间有什么区别
@rx 表示后面是正则表达式。正如我所说,它是默认值,因此实际上不需要包含在内,因为除非提供另一个 @ 命令,否则将假定 @rx。
!@rx 表示正则表达式应该not被匹配 - 即将此规则应用于与此正则表达式不匹配的任何请求。
我可以用这样的正则表达式来写这个吗?
SecRule REQUEST_URI "!@rx ^(:?\/secure\/test\/bla\/bla\?.+)$" \
"phase:1,id:91,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403
访问被拒绝',链”
SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"
不,这说明了任何事情not匹配第一个正则表达式,也是应该被阻止的帖子。
因此对 /anything 的 POST 请求将被阻止。
并且对 /anything 的 GET 请求不会被阻止。
这似乎与您想要的完全相反!
尽管 POST 到 /secure/test/bla/bla/ 仍将被允许,因为它与第一个规则不匹配,因此被允许通过。
我真的认为你需要学习 ModSecurity 的基础知识,因为你显然很难理解这一点。
ModSecurity 规则的基本语法是:
SecRule \
VARIABLE_TO_CHECK \
VALUE_TO_CHECK_FOR \
ACTION_TO_TAKE_IF_MATCHED \
使用 \ 允许您将规则分隔为多个行以提高可读性。
VARIABLE_TO_CHECK 可以是 ModSecurity 变量列表中的任何一个
(https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Variables https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Variables)
VALUE_TO_CHECK_FOR 默认是正则表达式。虽然可以
例如,更改为直字符串比较。这将是
与 VARIABLE_TO_CHECK 的值进行比较,如果它与
ACTION_TO_TAKE_IF_MATCHED 将被运行,如果不匹配则
ModSecurity 将停止处理此请求的此规则并移动
继续下一条规则。
ACTION_TO_TAKE_IF_MATCHED 是操作列表
(https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Actions https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Actions)。
每个规则必须有一个 id,然后通常会阻止请求
上面的匹配(使用deny
)或白名单请求(使用allow
).
例如:
SecRule \
REQUEST_URI \
"^/secure/test/bla/bla/.*" \
"id:1234,deny"
将拒绝任何对 /secure/test/bla/bla/ 的请求(GET 和 POST)。
如果您想检查两个变量,那么您需要将两个不同的规则链接在一起,在这种情况下,只有当整个链与所有规则匹配时,才会发生任何破坏性操作(例如拒绝) - 但令人困惑的是,第一个规则必须说明最终操作拿。
SecRule \
REQUEST_URI \
"^/secure/test/bla/bla/.*" \
"id:1234,deny,chain"
SecRule \
REQUEST_METHOD \
"GET"
因此,此规则将拒绝对以 /secure/test/bla/bla/ 开头的任何位置的任何请求,这也是一个 GET 请求。
构建链接规则时,它很快就会变得混乱,因此建议您首先测试每个单独的规则,以确认其块是否合适,然后将它们链接在一起。
正如我之前建议的,我强烈建议您购买并阅读Mod安全手册 https://www.feistyduck.com/books/modsecurity-handbook/教您 ModSecurity 如何工作。