推荐使用setenvifnocase+require组合方式拒绝特定user-agent,即在directory或virtualhost块内设置bad_ua环境变量并用放行所有请求但排除bad_ua,同时可添加^$匹配空ua增强防护,避免使用已废弃的order/deny/allow指令。

直接在 httpd.conf 中配置拒绝特定 User-Agent,推荐使用 SetEnvIfNoCase + Require 组合方式,兼容 Apache 2.4+,语义清晰、性能好、无需重写模块。
核心配置结构(推荐)
在对应站点的 <directory></directory> 或虚拟主机 <virtualhost></virtualhost> 块内添加:
SetEnvIfNoCase User-Agent "(sqlmap|nikto|gobuster|feroxbuster|wfuzz|ffuf|masscan|nmap|curl|wget|python-urllib|java|apachebench|zmeu|oBot|mj12bot|heritrix)" BAD_UA
<requireall>
Require all granted
Require not env BAD_UA
</requireall>
说明:
-
SetEnvIfNoCase不区分大小写匹配 UA 字符串,命中即设置环境变量BAD_UA -
<requireall></requireall>表示“全部条件满足才放行”,即:允许所有请求 且 排除带BAD_UA环境变量的请求 - 避免使用已废弃的
Order / Deny / Allow(Apache 2.4+ 不再推荐)
补充:拦截空或极简 UA
很多扫描器不发 UA 或只发空白值,可单独加一条规则增强防护:
SetEnvIfNoCase User-Agent "^$" BAD_UA_EMPTY
<requireall>
Require all granted
Require not env BAD_UA_EMPTY
</requireall>
注意:^$ 精确匹配空字符串,误伤率极低,建议启用。
验证与调试建议
上线前务必测试匹配准确性,防止误封:
- 先用
tail -f /var/log/httpd/access_log观察日志,确认是否真有匹配到的 UA - 临时把
Require not env BAD_UA换成Require env BAD_UA,用 curl 模拟测试:curl -H "User-Agent: sqlmap/1.7" http://yoursite.com/应返回 403 - 生产环境首次启用时,建议搭配自定义日志记录匹配行为:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{User-Agent}i\" %{BAD_UA}e" ua_log
再在 VirtualHost 中启用:CustomLog logs/ua_blocked.log ua_log env=BAD_UA
常见误区提醒
以下做法不推荐:
- 在全局
httpd.conf顶部盲目添加规则——应限定作用域(如仅对/var/www/html生效) - 正则过度宽泛,例如写
chrome或firefox——极易误杀真实用户 - 混用旧版指令(如
Deny from env=...)而不检查 Apache 版本,导致配置不生效 - 未重启服务:
systemctl reload httpd或apachectl graceful才能生效











