我正在尝试编写一个modsecurity规则,将匹配几个坏的User-Agent字符串。用户代理字符串看起来像这样:"坏代理名称(+http://example.com/)">
但我的规则似乎不起作用:
SecRule REQUEST_HEADERS:User-Agent "@rx (?:yandex|daum|bad-agent name)"
"msg:'Spiderbot blocked - UA: %{REQUEST_HEADERS:USER-AGENT}',id:10008,log,t:lowercase,drop,phase:1"
我做错了什么?我正在尝试匹配用户代理字符串开头的字符串,如"以"开头。我非常熟悉正则表达式,但modsecurity正则表达式语法无处可寻。
感谢你的规则看起来基本正确。
-
确保SecRuleEngine指令被设置为
On
而不是DetectionOnly
,否则你的规则的drop
动作将永远不会被执行,即使规则匹配。注意:检查错误日志文件。如果你看到你的规则是匹配(并被记录),但您的测试没有预期的结果(没有丢失的连接),这将表明您的ModSecurity实例处于
DetectionOnly
模式。您还可以将
drop
替换为deny
,这可能更容易测试(403响应将是您的规则正在工作的具体指示!)。 -
如果确实需要锚定正则表达式,可以使用:
^(?:yandex|daum|bad-agent name)
-
注意,使用变量的语法与定义变量的语法是不同的,所以:
应:%{REQUEST_HEADERS:USER-AGENT}
%{REQUEST_HEADERS.USER-AGENT}
-
使用
t:none
启动转换管道以取消任何"默认值"的效果是很好的实践。可能已经到位的转换。所以:t:lowercase
将成为:
t:none,t:lowercase