http响应拆分漏洞(crlf注入)是因web应用未过滤用户输入中的%0d%0a字符,导致攻击者篡改http响应头结构,可引发xss、会话固定等风险;其本质是crlf被误解析为行分隔符,使一个响应被拆分为多个。

Apache 本身不直接处理应用层的响应头拼接逻辑,因此防范 HTTP 响应拆分(CRLF 注入)的关键不在 Apache 配置本身,而在于后端应用对用户输入的严格过滤与编码。但 Apache 可以通过配置辅助拦截、限制或缓解该类攻击风险。
核心防护原则:杜绝 CRLF 进入响应头
HTTP 响应拆分漏洞的本质是:攻击者将 %0d%0a(即 \r\n)注入到 Location、Set-Cookie、X-Forwarded-For 等响应头字段中,导致服务器发出两个独立响应。Apache 不会自动校验这些字段内容——这必须由 PHP、Python、Java 等后端代码完成。Apache 能做的,是设防于前、阻断于外、缩小影响面。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
在 Apache 层可实施的三项关键措施
-
禁用危险模块与函数调用入口:关闭
mod_cgi或未加固的 CGI 脚本(如老旧 PHP 的header()直接拼接),避免绕过应用逻辑直接输出响应头;确需使用,须配合mod_security规则拦截含\r或\n的请求参数。 -
用 ModSecurity 拦截 CRLF 注入特征:启用 OWASP CRS 规则集,重点开启以下规则:
–920100(检测 CRLF 在请求头中)
–920120(检测 CRLF 在 URL 参数中)
–920170(检测回车换行在 Cookie 中)
建议在 SecRule 中补充自定义规则:SecRule ARGS|ARGS_NAMES "@rx \r|\n|%0d|%0a" "id:1001,deny,status:400,msg:'CRLF injection detected'" -
限制敏感响应头的动态构造范围:避免将用户可控数据(如
Referer、Host、URL 查询参数)直接写入Location或Set-Cookie。若业务必须跳转,Apache 可用RewriteCond+RewriteRule做白名单重定向,例如只允许跳转到预设域名:RewriteCond %{QUERY_STRING} ^url=([^&]+)RewriteCond %{REQUEST_URI} ^/redirect\.php$RewriteCond %{ENV:REDIRECT_url} ^(https?://example\.com/.*|/.*|)$RewriteRule ^ - [E=SAFE_REDIRECT:%1]
再由后端仅从SAFE_REDIRECT环境变量取值生成 Location,不直接信任原始参数。
后端开发不可跳过的硬性要求
Apache 防不住没做过滤的代码。以下必须由应用层落实:
- 所有写入响应头的用户输入(如
header("Location: " . $_GET['url']))必须先做str_replace(["\r", "\n", "%0d", "%0a"], "", $input)或更严格的正则清洗; - PHP 推荐改用
header("Location: " . rawurlencode($safe_url), true, 302)并验证协议与域名; - Java 中避免
response.setHeader("X-User", request.getParameter("x")),改用白名单枚举或编码输出; - Python Flask/Django 应使用框架内置的重定向函数(如
redirect(url_for(...))),而非手动拼接Location头。
额外加固:隐藏与隔离
即便发生响应拆分,降低其危害也很重要:
- 设置
ServerTokens Prod和ServerSignature Off,避免泄露 Apache 版本,减小攻击者针对性利用信心; - 对含用户输入的响应头,统一添加
HttpOnly; Secure; SameSite=Strict到 Set-Cookie,限制 XSS 辅助利用; - 反向代理层(如 Nginx 前置)可配置
underscores_in_headers off和严格头长度限制,进一步过滤异常请求。










