我正在开发一个 Symfony 2 网站,并尝试创建一个 ModSecurity 规则来匹配特定的浏览器 URL。IE example.com/results
Symfony 2 使用 .htaccess 中的规则在内部重写对 app.php 的所有请求,因此当我在 ModSecurity 规则中检查 REQUEST_URI 时,它被设置为 app.php。我尝试了任何其他看似相关的服务器参数,但都是 app.php 或空白。
有没有办法在配置文件中创建基于浏览器请求的 URL 而不是内部重写的结果的 ModSecurity 规则?
CMS(如 wordpress)似乎也存在同样的问题:所有内容都被重写为 index.php,因此我找不到任何方法将 modsec 规则应用于特定路由。(我想,由于 WP 非常常见,我可能能够通过在那里搜索相同的问题来找到答案。)
答案1
看起来我可以使用服务器变量
THE_REQUEST
,按照这个答案:https://stackoverflow.com/a/27968463/160565:
我正在使用 mod_rewrite 将其转储
THE_REQUEST
到 mod_security 规则上方的环境变量中,然后对其进行匹配。
如上所述,THE_REQUEST
是 mod_rewrite 使用的 Apache 服务器变量,而不是 mod_security 变量。mod_security 中直接等效的变量是REQUEST_LINE
,即请求的第一行。它采用如下字符串形式:
GET /foo/bar HTTP/1.1
THE_REQUEST
当 URL 重写时,(mod_rewrite) 变量不会改变,而REQUEST_URI
(mod_rewrite) 会改变。
然而,我有点惊讶的是REQUEST_URI
(mod_security)变量返回的是重写的 URL(这可能与指令的顺序或使用 mod_security 有关嵌入?),而不是最初请求的 URL,除非您实际上REQUEST_URI
在 mod_security 规则中使用了(mod_rewrite)变量(将其分配给环境变量?)?
就在 mod_security 规则之上......
mod_security 规则可能应该位于文件顶部(如果尚未位于顶部),位于任何 mod_rewrite 指令之前。(虽然我不确定顺序是否真的很重要。)
请注意,尽管名称相同,但REQUEST_URI
(mod_security) 变量与 (mod_rewrite) 变量并不相同。值得注意的是, (mod_security) 包含查询字符串,而(mod_rewrite) 不包含。REQUEST_URI
REQUEST_URI
REQUEST_URI
参考:
更新:
...
REQUEST_URI
(mod_security) 变量正在返回重写的 URL
您可能在请求中运行 mod_security 规则太晚了,即在错误的phase
?要处理请求您应该比较的 URLREQUEST_URI
为阶段1 或 2(请求)。后续阶段(即 3 - 5)将根据响应进行处理,这也许可以解释为什么您看到的是重写的 URL,而不是请求的 URL。
设置phase
在行动参数或SetDefaultAction
指令。例如:
SecDefaultAction "log,pass,phase:2,id:4"
SecRule REQUEST_URI "attack" "phase:1,id:52,t:none,t:urlDecode,t:lowercase,t:normalizePath"
这五个阶段是:
- 请求标头(REQUEST_HEADERS)
- 请求正文(REQUEST_BODY)
- 响应标头(RESPONSE_HEADERS)
- 响应主体(RESPONSE_BODY)
- 日志记录 (LOGGING)
从 ModSecurity 版本 v2.7 开始,一些阶段编号有别名:
2 - 请求
4 - 响应
5 - 记录例子:
SecRule REQUEST_HEADERS:User-Agent "Test" "phase:request,log,deny,id:127"
参考:
答案2
看起来我可以使用服务器变量 THE_REQUEST,按照这个答案:https://stackoverflow.com/a/27968463/160565