Http Mod security块获取对URI路径的请求

Http Mod security块获取对URI路径的请求,http,get,apache2,mod-security,mod-security2,Http,Get,Apache2,Mod Security,Mod Security2,我需要阻止特定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:normal

我需要阻止特定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"
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
这些都不起作用,我不明白为什么,我需要以不同的方式编写正则表达式吗


在secound规则中,我是否需要添加
“@rx
”?两者之间有什么区别@rx和@rx

这是这个问题的延续:

我不知道这意味着什么。你能把它改写得更有意义吗?你是说URL将包含另一个域吗

你给出的例子有几个地方不对劲。例如,本部分:

"@streq \/secure\/test\/bla\/bla\?.+"
@streq
表示这是一个直接的字符串比较。所以你不能使用
?。+
部分-我猜这看起来是正则表达式的一部分?如果需要正则表达式,则这是默认值,因此不包括
@streq
位:

"\/secure\/test\/bla\/bla\?.+"
我也不认为你需要逃避前斜杠,但这样做应该没有坏处

你还有这个:

SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"
当您想要阻止获取请求时,为什么要检查post

在secound规则中,我需要添加“@rx”吗?有什么区别 中间“@rx和@rx

@rx表示下面是一个正则表达式。正如我所说,这是默认值,因此实际上不需要包括@rx,除非提供另一个@command

!@rx表示正则表达式应匹配-即,将此规则应用于与此正则表达式不匹配的任何请求

我可以用这样的正则表达式来写这个吗

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"
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请求_方法“@streq post”t:none,t:lowercase

不。这表示任何与第一个正则表达式不匹配的内容都应该被阻止

因此,向/向任何内容发布请求都将被阻止。 和GET请求/任何内容都不会被阻止。 这似乎与你想要的正好相反! 尽管仍然允许向/secure/test/bla/bla/发送帖子,因为它与第一条规则不匹配,因此允许通过

我真的认为你需要学习ModSecurity的基础知识,因为你显然很难理解这一点

ModSecurity规则的基本语法为:

SecRule \
  VARIABLE_TO_CHECK \
  VALUE_TO_CHECK_FOR \
  ACTION_TO_TAKE_IF_MATCHED \
通过\允许您在多条线上分隔规则以提高可读性

  • 变量_TO_CHECK可以是ModSecurity变量列表中的任意一个 ()

  • 默认情况下,值\u TO\u CHECK\u是一个正则表达式。尽管可以是 例如,更改为直字符串比较。它将 与变量_to_的值进行比较,检查其是否与 如果匹配将运行操作,如果不匹配则运行操作 ModSecurity将停止处理此请求的此规则并移动 继续下一条规则

  • 如果匹配的是操作列表,则执行操作 (). 每个规则必须有一个id,然后通常会阻止请求 上面的匹配项(使用
    拒绝
    )或白名单请求(使用
    
    允许

例如:

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