请求走私是一种隐蔽却危害极大的Web攻击手法,它建立在CDN、负载均衡器等中间代理与后端应用服务器对HTTP请求边界理解不一致的基础上。当攻击者在同一个TCP连接中塞入前后端解析方式不同的请求时,后端可能把前一个请求的尾部当成下一个请求的开头,从而绕过WAF规则或越权访问内部接口。在CDN边缘做请求行与头部的规范化,相当于在流量最前端强制统一HTTP语义,让所有抵达源站的请求都只有一种合法解释。

为什么前端与后端解析差异会导致请求走私
HTTP协议在RFC 7230中定义了请求行与头部的格式,但现实中的实现各有妥协。例如对于Content-Length与Transfer-Encoding同时出现的请求,规范明确要求忽略Content-Length,但部分老版本服务器仍会读取它。当CDN以Transfer-Encoding: chunked转发、后端却按Content-Length截断时,剩余字节便成为走私内容。这种差异在反向代理场景中尤为普遍,因为边缘节点往往只做转发而不重写body边界。
另一种常见问题是头部中的_obs-fold_(折叠头部)与重复头部。有些代理会把多行以空格开头的头部合并,有些则视为独立头部;当Host头出现两次,前端取第一个,后端取最后一个,攻击者便能借助顺序差异注入路由信息。请求行本身也容易被利用:超出标准长度的URL、包含控制字符的请求行,在不同解析器中可能触发不同的截断逻辑。只有理解这些分歧点,才能在边缘设计有效的归一化规则。
从架构角度看,CDN处于用户与源站之间,具备全量流量可见性,且通常支持Lua或类似脚本扩展。把防护放在边缘,意味着不必改造后端多种语言框架,也避免了源站性能损耗。同时边缘节点可以针对每个域名下发统一策略,防止某个老旧业务泄露走私缺口。因此,规范化请求行与头部应当作为CDN基础安全能力,而非可选插件。
请求行与头部的规范化策略设计
规范请求行首先要限制其长度与字符集。绝大多数业务路径不会超过2KB,可强制截断或拒绝超长请求行,并拒绝包含未经编码的控制字符(如r、n、