对 Apache modsec 比较陌生。尝试做一些简单的事情,但遇到了障碍。我想根据 User-Agent 设置一个环境变量,并通过设置标头来测试它。我有这个:
SecRule HTTP_User_Agent "Gecko" "phase:2,nolog,setenv:MOZTEST=1,id:100000025"
Header always set MozTest "1" env=MOZTEST
以为在 Firefox 中应该设置 MozTest 标头,但事实并非如此。我还尝试用 REQUEST_HEADERS:User-Agent 代替 HTTP_User-Agent,但仍然没有效果。还尝试将阶段增加到 5,即使它应该在第 2 阶段具有用户代理。没有错误;规则似乎没有触发。
我猜是因为没有设置 user-agent 变量,但我不知道为什么。(或者甚至不知道如何测试,因为我从来没有做过任何自定义日志记录。)
答案1
几年后,我在研究另一个问题时发现了自己的问题。
看来这里的主要问题是我试图在 mod_security 上下文中使用 mod_rewrite 变量 (HTTP_USER_AGENT)。相反,我可以使用正确的 ModSecurity 变量 (REQUEST_HEADERS:User-Agent),或者将 mod rewrite 变量作为环境变量传递(当有 ModSecurity 替代方案可用时,没有充分的理由这样做。)
所以我上面的例子应该是这样的:
SecRule REQUEST_HEADERS:User-Agent "Gecko" "phase:2,nolog,setenv:MOZTEST=1,id:100000025"
Header always set MozTest "1" env=MOZTEST
ModSecurity 可用的变量完整列表如下:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-(v2.x)#Variables
或者 - 在这种情况下没有用,但在其他情况下可能值得注意 - 我可以使用 mod rewrite 将用户代理转储到环境变量中,然后与 mod security 进行匹配,如下所示:
RewriteRule .* - [E=user_agent:%{HTTP_USER_AGENT}]
SecRule ENV:user_agent "Gecko" "phase:2,nolog,setenv:MOZTEST=1,id:100000025"
Header always set MozTest "1" env=MOZTEST