http - Mod security 阻止对 URI 路径的 GET 请求

标签 http get apache2 mod-security mod-security2

我需要阻止某个 URI 路径的 GET 请求。 我正在使用异常模式,但我使用的是直接 block 规则,我无法让规则正常工作

例子 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 和@rx 之间有什么区别?

最佳答案

所以这是这个问题的延续: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"

为什么要阻止 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"

没有。这表示任何匹配第一个正则表达式并且也是帖子的内容都应该被阻止。

所以对/anything 的 POST 请求将被阻止。 并且不会阻止对/anything 的 GET 请求。 这似乎与您想要的完全相反! 尽管仍然允许对/secure/test/bla/bla/的 POST,因为它不匹配第一条规则,因此被允许通过。

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

ModSecurity 规则的基本语法是:

SecRule \
  VARIABLE_TO_CHECK \
  VALUE_TO_CHECK_FOR \
  ACTION_TO_TAKE_IF_MATCHED \

使用\可以将一条规则分隔成几行以提高可读性。

例如:

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 的工作原理。

关于http - Mod security 阻止对 URI 路径的 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40045400/

相关文章:

android - 客户端接收状态 307 的正确行为

java - Android 的 HttpURLConnection 在 HEAD 请求上抛出 EOFException

javascript - 如何使用 javascript 对象的 get 和 set 函数

r - 是否可以在 tomcat 6.0 上安装 rApache?

java - 如何使用 spring boot 应用程序从 Rest API 返回 html

在 C 中创建一个简单的 HTTP 代理

php - 设置变量 $_GET 全局(添加好友)

ios - 将 image/jpeg 从 GET 请求转换为 UIImage

php - 如何在一台服务器上使用两个不同的 PHP 版本

apache - apache error_log 中非常奇怪的条目。这是一次钓鱼探险吗?