我需要阻止某个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"
我能用这样的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"
这些不起作用,我无法弄清楚为什么,我是否需要以不同的方式编写正则表达式?
在secound规则中,我是否需要添加"@rx
?什么是"!@rx and @rx
答案 0 :(得分:2)
所以这是这个问题的延续: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"
当您想阻止获取请求时,为什么要检查发布?
在secound规则中,我是否需要添加" @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:无,T:小写"
没有。这表示不与第一个正则表达式匹配的任何内容都应该被阻止。
因此,阻止对/ what的POST请求。 并且GET请求/任何内容都不会被阻止。 这似乎与你想要的完全相反! 虽然仍然允许对/ secure / test / bla / bla /进行POST,因为它与第一个规则不匹配,因此允许通过。
我真的认为你需要学习ModSecurity的基础知识,因为你显然很难理解这一点。
ModSecurity规则的基本语法是:
SecRule \
VARIABLE_TO_CHECK \
VALUE_TO_CHECK_FOR \
ACTION_TO_TAKE_IF_MATCHED \
使用\允许您将规则分成几个Iines以便于阅读。
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的工作原理。