You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ModSecurity恶意Bot拦截规则失效:@pmFromFile与@beginswith问题求助

解决ModSecurity恶意Bot拦截规则失效问题

嘿,我之前在配置ModSecurity拦截恶意Bot时也踩过类似的坑,给你梳理下问题根源和解决办法:

核心问题:@beginswith不支持正则分组匹配

你之前写的@beginswith (black.?hole|blackwidow|...)是错误用法——ModSecurity的@beginswith运算符只接受单个或多个空格分隔的纯字符串前缀,不支持正则表达式的|分组语法,这就是规则完全不生效的原因。

正确的两种实现思路

1. 纯前缀匹配(无正则模糊需求)

如果你的Bot标识都是固定前缀(不需要black.?hole这种模糊匹配),可以直接用@beginswith加空格分隔多个前缀:

SecRule REQUEST_HEADERS:User-Agent "@beginswith blackhole blackwidow blowfish botalot buddy builtbottough bullseye" "id:'444440',phase:2,t:none,deny,status:406,log,msg:'BAD BOT - Detected and Blocked.'"

2. 前缀正则匹配(支持模糊变种)

如果需要像black.?hole这种带通配符的前缀匹配,必须改用@rx(正则匹配)运算符,同时用^锚定字符串开头,确保只匹配前缀:

SecRule REQUEST_HEADERS:User-Agent "@rx ^(black.?hole|blackwidow|blowfish|botalot|buddy|builtbottough|bullseye)" "id:'444440',phase:2,t:none,deny,status:406,log,msg:'BAD BOT - Detected and Blocked.'"

这里注意ModSecurity使用PCRE正则语法,你的表达式要符合规范:比如black.?hole里的.匹配任意单个字符,?表示前面的字符可选,能覆盖blackhole、black hole这类变种。

额外调试与优化建议

  • 开启调试日志排查:配置ModSecurity调试日志,查看规则未触发的具体原因:
    SecDebugLog /var/log/apache2/modsec_debug.log
    SecDebugLogLevel 9
    
    测试后查看日志,能清楚看到User-Agent的实际值、正则匹配的结果。
  • 大小写兼容处理:很多Bot会篡改User-Agent的大小写,建议加上t:lowercase转换为小写后匹配,避免绕过:
    SecRule REQUEST_HEADERS:User-Agent "@rx ^(black.?hole|blackwidow|blowfish)" "id:'444440',phase:2,t:lowercase,deny,status:406,log,msg:'BAD BOT - Detected and Blocked.'"
    
  • 用curl快速测试:模拟恶意Bot请求验证规则是否生效:
    curl -A "blackhole" http://your-domain.com
    
    查看服务器日志或ModSecurity审计日志,确认是否触发了406拦截。

内容的提问来源于stack exchange,提问作者abkrim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:31:03