Mod security 阻止对 URI 路径的 GET 请求
Mod security Block GET request to URI path
我需要阻止某个 URI 路径的 GET 请求。
我正在使用异常模式,但我使用的是直接块规则,我无法使规则正常工作
示例GET /secure/test/bla/bla/
示例 https://bla.bla.com/secure/test/bla/bla?www.test.com
SecRule REQUEST_URI "@streq \/secure\/test\/bla\/bla\?.+" \
"phase:1,id:92,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"
我可以用这样的正则表达式写这个吗?
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"
这些都不起作用,我不明白为什么,我需要用不同的方式编写正则表达式吗?
第二条规则需要加"@rx
吗? "!@rx and @rx
有什么区别
所以这是这个问题的延续:
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"
为什么要阻止 get 请求时检查 post?
In the secound rule do I need to add "@rx? whats the difference
betweeen "!@rx and @rx
@rx 表示后面是正则表达式。正如我所说,这是默认设置,因此实际上不需要包括在内,因为除非提供另一个 @ 命令,否则将假定为 @rx。
!@rx 表示正则表达式应该 不 被匹配——即将这个规则应用到任何不匹配这个正则表达式的请求。
Can I write this with a reg expression like so ?
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"
没有。这表示任何 不 匹配第一个正则表达式并且也是 post 的东西都应该被阻止。
所以 POST 对 /anything 的请求将被阻止。
并且不会阻止对 /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)
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)。
每个规则都必须有一个 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 请求。
构建链式规则时,它很快就会变得混乱,因此建议您先测试每个单独的规则以确认它是否适当阻止,然后将它们链接在一起。
正如我之前所建议的,我强烈建议您购买并阅读 ModSecurity handbook 以了解 ModSecurity 的工作原理。
我需要阻止某个 URI 路径的 GET 请求。 我正在使用异常模式,但我使用的是直接块规则,我无法使规则正常工作
示例GET /secure/test/bla/bla/
示例 https://bla.bla.com/secure/test/bla/bla?www.test.com
SecRule REQUEST_URI "@streq \/secure\/test\/bla\/bla\?.+" \
"phase:1,id:92,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"
我可以用这样的正则表达式写这个吗?
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"
这些都不起作用,我不明白为什么,我需要用不同的方式编写正则表达式吗?
第二条规则需要加"@rx
吗? "!@rx and @rx
所以这是这个问题的延续:
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"
为什么要阻止 get 请求时检查 post?
In the secound rule do I need to add "@rx? whats the difference betweeen "!@rx and @rx
@rx 表示后面是正则表达式。正如我所说,这是默认设置,因此实际上不需要包括在内,因为除非提供另一个 @ 命令,否则将假定为 @rx。
!@rx 表示正则表达式应该 不 被匹配——即将这个规则应用到任何不匹配这个正则表达式的请求。
Can I write this with a reg expression like so ?
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"
没有。这表示任何 不 匹配第一个正则表达式并且也是 post 的东西都应该被阻止。
所以 POST 对 /anything 的请求将被阻止。 并且不会阻止对 /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)
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)。 每个规则都必须有一个 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 请求。
构建链式规则时,它很快就会变得混乱,因此建议您先测试每个单独的规则以确认它是否适当阻止,然后将它们链接在一起。
正如我之前所建议的,我强烈建议您购买并阅读 ModSecurity handbook 以了解 ModSecurity 的工作原理。