2

我需要阻止某个 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"

这些不起作用,我不知道为什么,我需要以不同的方式编写正则表达式吗?

在第二条规则中我需要添加"@rx吗?有什么区别"!@rx and @rx

4

1 回答 1

3

所以这是这个问题的延续: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 的工作原理。

于 2016-10-14T20:56:32.740 回答