如何配置最简单有用的默认拒绝规则集mod_security
?
我想配置mod_security
以允许仅有的对单个目录的非常具体的查询:
简而言之:我使用 Apache 作为目录的反向代理/web_app/
,此目录中将有一个名为的 php 文件get.php
。我只想将与以下正则表达式匹配的查询传递给此脚本:
获取\.php\?ver=1&id=[af\d]{16,16}&v=[-.az\d\ ]{1,20}
换句话说,查询仅包含三个字段:id
、ver
和v
。其中第一个是数字 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 与您想要/允许的方法不匹配,您可以添加一条附加规则来阻止。