所以这是这个问题的延续:modsecurity create rule disable GET request
example GET /secure/test/bla/bla/ example
https://bla.bla.com/secure/test/bla/bla?www.test.com
我不知道这是什么意思。你能把它改写成更有意义吗?您是说 URL 将包含另一个域吗?
您给出的示例有几处错误。例如这部分:
"@streq \/secure\/test\/bla\/bla\?.+"
这@streq
意味着这是一个直接的字符串比较。所以你不能使用?.+
部分——我猜这看起来是正则表达式的一部分?如果你想要一个正则表达式,那么这是默认的,所以不要包括这个@streq
位:
"\/secure\/test\/bla\/bla\?.+"
我也不认为你需要逃避正斜杠,但这样做应该没有害处。
你也有这个:
SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"
当您想阻止获取请求时,为什么要检查帖子?
在第二条规则中,我是否需要添加“@rx?”!@rx 和 @rx 之间有什么区别
@rx 表示后面是一个正则表达式。正如我所说,它是默认设置,因此实际上不需要包含,因为除非提供另一个 @ 命令,否则将假定 @rx 。
!@rx 表示不应匹配正则表达式- 即将此规则应用于与此正则表达式不匹配的任何请求。
我可以用这样的 reg 表达式来写这个吗?
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
Access Denied',chain" SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"
不,这表示任何与第一个正则表达式不匹配的内容并且应该被阻止。
因此对 /anything 的 POST 请求将被阻止。对 /anything 的 GET 请求不会被阻止。这似乎与您想要的完全相反!尽管 /secure/test/bla/bla/ 的 POST 仍将被允许,因为它与第一条规则不匹配,因此被允许通过。
我真的认为你需要学习 ModSecurity 的基础知识,因为你显然很难理解这一点。
ModSecurity 规则的基本语法是:
SecRule \
VARIABLE_TO_CHECK \
VALUE_TO_CHECK_FOR \
ACTION_TO_TAKE_IF_MATCHED \
使用 \ 允许您将规则分隔在多个 Iine 上以提高可读性。
例如:
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 请求。
在构建链式规则时,它很快就会变得混乱,因此建议您首先测试每个单独的规则以确认它是否适合,然后将它们链接在一起。
正如我之前建议的那样,我强烈建议您购买并阅读ModSecurity 手册,以教您 ModSecurity 的工作原理。