HTTP请求头攻击是Web应用中常见的安全威胁之一,当使用Nginx作为反向代理时,正确处理请求头对于系统安全至关重要。以下是关于HTTP请求头攻击的分析和Nginx防御策略。
Host头攻击
X-Forwarded-For欺骗
HTTP头注入
过大或过多的请求头
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;
# }
}
# 只接受来自可信代理的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;
}
# 删除不必要的请求头
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;
}
# 拒绝包含换行符的请求头
if ($http_user_agent ~* "\n") {
return 403;
}
if ($http_referer ~* "\n") {
return 403;
}
# 或者更全面的正则检查
if ($http_user_agent ~* [\x00-\x1F\x7F]) {
return 403;
}
http {
# 限制请求头总大小
client_header_buffer_size 1k;
# 限制大型请求头缓冲区数量和大小
large_client_header_buffers 4 8k;
# 限制请求头读取时间
client_header_timeout 10s;
}
# 使用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;
通过以上配置和策略,可以显著提高Nginx反向代理环境下的HTTP请求头安全性,防范多种基于请求头的攻击。