Apache 通过 mod_headers 和 ModSecurity 协同实现协议头过滤:前者清理高风险头字段,后者执行规则匹配与拦截;需同时启用两模块,配合 SecRule 检测恶意内容并记录日志溯源。

Apache 本身不提供“协议头过滤”这个独立功能,但能通过 mod_headers 和 ModSecurity 协同实现对非法或恶意 HTTP 请求头的识别、清理与拦截。关键不是删掉头,而是防止它们被滥用为攻击入口(如 XSS、SSRF、服务端模板注入等)。
启用必要模块并确认加载
两项模块必须同时启用,缺一不可:
- mod_headers:用于读取、修改、移除请求头(但不能做逻辑判断)
- mod_security(推荐 v3.x):真正执行规则匹配、解码还原、正则扫描和拦截动作
验证方式(Linux):
apache2ctl -M | grep -E "(headers|security)"
若未出现,需启用:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Debian/Ubuntu:
sudo a2enmod headers security2 - RHEL/CentOS:检查
httpd.conf中是否取消注释:LoadModule headers_module modules/mod_headers.so和LoadModule security2_module modules/mod_security2.so
用 mod_headers 主动清理高风险头字段
对已知易被滥用来传递 payload 的头,直接截断或清除:
- 限制
User-Agent长度并标准化:RequestHeader edit User-Agent "^(.{0,255}).*" "$1" early - 禁止客户端设置响应头(防 header 注入):
RequestHeader unset X-Content-Type-Options early - 移除可能被用于绕过或注入的自定义头:
RequestHeader unset X-Original-URL earlyRequestHeader unset X-Forwarded-For early(如业务无需透传 IP)
用 ModSecurity 规则精准拦截恶意内容
所有检测逻辑写在 SecRule 中,指定变量名 + 匹配操作 + 拦截动作:
- 拦截含脚本标签的
User-Agent(注意 URL 编码):SecRule REQUEST_HEADERS:User-Agent "@rx %3Cscript|%3Cimg|javascript%3A" "id:1001,phase:1,deny,msg:'XSS in UA'" - 阻止
Referer中的 SQL 注入特征:SecRule REQUEST_HEADERS:Referer "@rx (?i)(union\s+select|select\s+.*?from)" "id:1002,phase:1,deny,msg:'SQLi via Referer'" - 限制
Cookie头总长度防 DoS:SecRule REQUEST_HEADERS:Cookie "@gt 2048" "id:1003,phase:1,deny,msg:'Overlong Cookie'" - 检测编码绕过的 XSS:
SecRule REQUEST_HEADERS:Cookie "@rx %22%3E|%3Ciframe" "id:1004,phase:1,deny,msg:'Encoded XSS in Cookie'"
日志记录与调试建议
拦截后仅返回 403 不够,需保留上下文便于溯源:
- 在 SecRule 中添加
logdata:'UA=%{REQUEST_HEADERS.User-Agent}, Referer=%{REQUEST_HEADERS.Referer}' - 开启 ModSecurity audit log(
SecAuditEngine RelevantOnly),输出到独立文件 - 用 curl 模拟测试:
curl -H "User-Agent: <script>alert(1)</script>" https://yoursite.com/,观察是否返回 403 并出现在审计日志中

















