nginx 缓存层本身不限制请求头大小,真正起作用的是请求解析阶段的 client_header_buffer_size(默认1k)和 large_client_header_buffers(如4 8k),且单个请求头字段必须完整存入一个 buffer、不可拼接,超限则直接返回400或414错误。

直接拒绝无效 HTTP 头部请求,核心不是“过滤所有异常”,而是建立明确的准入边界——只放行结构合规、大小合理、方法可信的请求,其余一律快速拦截。关键在连接建立初期就切断恶意意图,不给服务器留等待或解析机会。
限制请求头大小与缓冲区
过大的头部是常见攻击入口(如长 Host、超长 User-Agent),Nginx 和 Apache 都支持硬性截断:
- Nginx 中设置 client_header_buffer_size 1k(默认值,建议保持)和 large_client_header_buffers 4 8k,超出即返回 400 Bad Request
- Apache 可通过 LimitRequestFieldSize 8190 控制单个头部长度,LimitRequestFields 100 限制头部字段总数
- 注意:IIS 默认无显式限制,需在
applicationHost.config中配置requestLimits.maxAllowedContentLength并配合 URL 重写模块丢弃异常头部
禁用危险 HTTP 方法并封禁 OPTIONS 探针
OPTIONS 请求常被用于探测服务器指纹,暴露 Server、X-Powered-By 等敏感信息,且本身不承载业务逻辑:
- IIS:在
web.config中添加<security><requestfiltering><verbs allowunlisted="false"><add verb="GET" allowed="true"></add><add verb="POST" allowed="true"></add></verbs></requestfiltering></security> - Nginx:使用
limit_except GET POST { deny all; }或更严格地直接if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|PATCH)$) { return 405; } - Apache:启用
mod_rewrite,用RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST|PUT|DELETE|PATCH)$+RewriteRule .* - [R=405,L]
强制 Host 头白名单校验
Host 头不可信,但可通过 default_server 或显式匹配实现“仅允许可信域名”策略:
- Nginx:定义一个
server { listen 80 default_server; return 444; }(444 是 Nginx 特有关闭连接码,不发响应),再为每个合法域名单独配server_name example.com; - Apache:用
ServerName明确主域名,并配合UseCanonicalName On强制使用该值生成跳转 Location,避免反射 Host - IIS:在站点绑定中只添加实际使用的域名,删除通配符或 IP 绑定;配合 URL 重写规则,对
{HTTP_HOST}不匹配白名单的请求返回 403
主动拒绝畸形头部与非法编码
不依赖应用层解析,而在 Web 服务器层面识别明显违规格式:
- 拒绝含控制字符(
\x00-\x08,\x0b-\x0c,\x0e-\x1f,\x7f)的头部值,Nginx 可用map+ 正则预判后return 400 - 拦截双编码、空字节注入类头部(如
Host: %252e%252e%252f),Apache 可启用mod_security的 CRS 规则集,Nginx 可集成 ModSecurity 或用 Lua 脚本做前置解码校验 - 禁止重复头部字段(如多个 Content-Length),现代 Nginx(≥1.19.0)默认已拒收,旧版本建议升级或启用
underscores_in_headers off防止绕过











