HTTP/2 使用 HPACK 头部压缩,通过动态表在连接内复用头部字段。当 CDN/反向代理与后端服务器对 Content-Length 与 Transfer-Encoding 的解析不一致时,攻击者可构造请求走私载荷,绕过前端访问控制并污染其他用户的请求。
一、Nginx 严格拒绝歧义请求头
nginx
server {
listen 443 ssl http2;
# 拒绝同时携带 Content-Length 与 Transfer-Encoding 的请求
if ($http_transfer_encoding ~* "chunked") {
set $deny 1;
}
if ($http_content_length != "") {
set $deny "${deny}1";
}
if ($deny = "11") {
return 400;
}
# 强制 HTTP/2 到后端使用 HTTP/1.1 并规范化头部
proxy_http_version 1.1;
proxy_set_header Transfer-Encoding "";
}