Apache2 mod_security 针对特定目录的简单默认拒绝规则

Apache2 mod_security 针对特定目录的简单默认拒绝规则

如何配置最简单有用的默认拒绝规则集mod_security

我想配置mod_security以允许仅有的对单个目录的非常具体的查询:

简而言之:我使用 Apache 作为目录的反向代理/web_app/,此目录中将有一个名为的 php 文件get.php。我只想将与以下正则表达式匹配的查询传递给此脚本:

获取\.php\?ver=1&id=[af\d]{16,16}&v=[-.az\d\ ]{1,20}

换句话说,查询仅包含三个字段:idverv。其中第一个是数字 1,第二个是 16 位十六进制数字,第三个是最多 20 个字符的字符串,包含字母、数字、点、连字符和空格。它必须拒绝或删除查询中除 POST 和 GET 值之外的任何内容,即:文件上传、cookie、所有非必要标头、除指定的 3 个值以外的值等...

我不想改变任何其他目录的工作方式,只是/web_app/。过滤错误的 UTF 或 URL 转义/编码不是问题,因此启用mod_security本身不应该是问题。

答案1

为了过滤参数,有一种更简单的方法,然后对整个 uri 使用正则表达式:

<Location /web_app>
  SecFilterSelective ARG_NAMES "!^(id|ver|v)$"
  SecFilterSelective ARG_ver   "!^1$"
  SecFilterSelective ARG_id    "!^[a-f\d]{16,16}"
  SecFilterSelective ARG_v     "!^[-\.a-z\d\ ]{1,20}"

  # Here the same for the request type
  SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$"
</Location>

将匹配仅在 下的列表中不存在的任何参数/web_app

您可以在 mod_security 文档中找到很好的例子:http://www.modsecurity.org/documentation/modsecurity-apache/1.9.3/html-multipage/09-examples.html

所有其他参数也可以在那里找到。

答案2

我想你需要这样的东西:

<LocationMatch "^/web_app/">
        SecRule REQUEST_URI "!(:?get\.php\?ver=1&id=([a-f\d]){16,16}&v=([-.a-z\d\ ]){1,20})" "id:123,phase:2, deny, status:406"
</LocationMatch>

对于 REQUEST_METHOD,如果 REQUEST_METHOD 与您想要/允许的方法不匹配,您可以添加一条附加规则来阻止。

相关内容