插件窝 干货文章 Nginx反向代理中的HTTP请求头攻击与防御

Nginx反向代理中的HTTP请求头攻击与防御

请求 header Forwarded Nginx 713    来源:    2025-04-20

Nginx反向代理中的HTTP请求头攻击与防御

HTTP请求头攻击是Web应用中常见的安全威胁之一,当使用Nginx作为反向代理时,正确处理请求头对于系统安全至关重要。以下是关于HTTP请求头攻击的分析和Nginx防御策略。

常见的HTTP请求头攻击类型

  1. Host头攻击

    • 攻击者伪造Host头,可能导致SSRF、缓存污染等问题
    • 可能导致应用逻辑错误或重定向攻击
  2. X-Forwarded-For欺骗

    • 攻击者伪造客户端真实IP
    • 可能导致IP白名单绕过、日志伪造等问题
  3. HTTP头注入

    • 通过注入恶意头实现CRLF注入攻击
    • 可能导致响应拆分、会话固定等问题
  4. 过大或过多的请求头

    • 消耗服务器资源
    • 可能导致拒绝服务(DoS)攻击

Nginx防御配置方案

1. 严格校验Host头

server {
    listen 80;
    server_name example.com www.example.com;

    # 拒绝非法Host头请求
    if ($host !~* ^(example.com|www.example.com)$ ) {
        return 444; # 直接关闭连接
    }

    # 或者重定向到正确域名
    # if ($host != "example.com") {
    #     return 301 https://example.com$request_uri;
    # }
}

2. 控制X-Forwarded-For头

# 只接受来自可信代理的X-Forwarded-For
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

# 限制X-Forwarded-For头的最大数量
map $http_x_forwarded_for $real_client_ip {
    default $remote_addr;
    "~^(?P<first>[^,]+)(?:,.*)?$" $first;
}

3. 清理和限制请求头

# 删除不必要的请求头
proxy_set_header X-Forwarded-Host "";
proxy_set_header X-Forwarded-Server "";

# 只保留必要的代理头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 限制请求头大小和数量
http {
    large_client_header_buffers 4 8k; # 4个8k缓冲区
    client_header_buffer_size 1k;
    client_header_timeout 10s;
}

4. 防止CRLF注入

# 拒绝包含换行符的请求头
if ($http_user_agent ~* "\n") {
    return 403;
}

if ($http_referer ~* "\n") {
    return 403;
}

# 或者更全面的正则检查
if ($http_user_agent ~* [\x00-\x1F\x7F]) {
    return 403;
}

5. 限制请求头大小和数量

http {
    # 限制请求头总大小
    client_header_buffer_size 1k;

    # 限制大型请求头缓冲区数量和大小
    large_client_header_buffers 4 8k;

    # 限制请求头读取时间
    client_header_timeout 10s;
}

6. 使用安全模块增强防护

# 使用ngx_http_headers_module添加安全头
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'";

# 使用ngx_http_limit_req_module限制请求速率
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

最佳实践建议

  1. 最小化原则:只转发必要的请求头,删除所有不必要的头
  2. 验证和清理:对所有传入的请求头进行验证和清理
  3. 默认拒绝:配置默认拒绝策略,只允许已知安全的头
  4. 日志记录:记录可疑的请求头模式以便分析
  5. 定期更新:保持Nginx版本更新以获取最新的安全修复
  6. 深度防御:结合应用层防护,不要仅依赖Nginx的防护

通过以上配置和策略,可以显著提高Nginx反向代理环境下的HTTP请求头安全性,防范多种基于请求头的攻击。