插件窝 干货文章 Nginx策略编写实践:防范XSS攻击

Nginx策略编写实践:防范XSS攻击

XSS Nginx request header 775    来源:    2025-04-20

Nginx策略编写实践:防范XSS攻击

XSS攻击概述

跨站脚本攻击(XSS)是一种常见的Web安全漏洞,攻击者通过在网页中注入恶意脚本,当其他用户浏览该页面时,脚本会在用户浏览器中执行,可能导致会话劫持、信息窃取等安全问题。

Nginx防范XSS的核心策略

1. 设置安全HTTP头

add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; style-src 'self' 'unsafe-inline';";
add_header X-Frame-Options "SAMEORIGIN";
  • X-XSS-Protection: 启用浏览器内置的XSS过滤器
  • X-Content-Type-Options: 防止MIME类型嗅探攻击
  • Content-Security-Policy: 定义允许加载资源的来源
  • X-Frame-Options: 防止点击劫持

2. 输入过滤与输出编码

# 阻止常见的XSS攻击向量
set $xss "";
if ($request_uri ~* "(<|%3C).*script.*(>|%3E)") {
    set $xss "1";
}
if ($request_uri ~* "javascript:") {
    set $xss "${xss}1";
}
if ($request_uri ~* "vbscript:") {
    set $xss "${xss}1";
}
if ($request_uri ~* "alert\(") {
    set $xss "${xss}1";
}
if ($request_uri ~* "document\.cookie") {
    set $xss "${xss}1";
}
if ($xss = "11111") {
    return 403;
}

3. 限制HTTP方法

# 只允许GET和POST方法
if ($request_method !~ ^(GET|POST)$ ) {
    return 405;
}

4. 防止MIME类型混淆

location ~* \.(php|jsp|cgi|pl|py|asp|aspx|sh|cgi)$ {
    return 403;
}

高级防护措施

1. 使用ModSecurity WAF

# 在Nginx中集成ModSecurity
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;

2. 基于Lua脚本的实时检测

location / {
    access_by_lua_block {
        local xss = require "resty.xss"
        local ok, err = xss.scan(ngx.var.request_uri)
        if not ok then
            ngx.log(ngx.ERR, "XSS attack detected: ", err)
            return ngx.exit(ngx.HTTP_FORBIDDEN)
        end
    }
    # 其他配置...
}

最佳实践建议

  1. 定期更新Nginx:保持Nginx版本最新以获取安全修复
  2. 最小化权限原则:以非root用户运行Nginx工作进程
  3. 日志监控:设置XSS攻击尝试的日志记录和告警
  4. 多层防御:Nginx防护应与应用层防护(如输入验证、输出编码)结合使用
  5. 测试验证:使用工具如OWASP ZAP或Burp Suite定期测试防护效果

示例完整配置片段

server {
    listen 80;
    server_name example.com;

    # 安全头设置
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; style-src 'self' 'unsafe-inline';";
    add_header X-Frame-Options "SAMEORIGIN";
    add_header Referrer-Policy "no-referrer-when-downgrade";

    # XSS过滤
    set $xss "";
    if ($request_uri ~* "(<|%3C).*script.*(>|%3E)") { set $xss "1"; }
    if ($request_uri ~* "javascript:") { set $xss "${xss}1"; }
    if ($request_uri ~* "vbscript:") { set $xss "${xss}1"; }
    if ($request_uri ~* "alert\(") { set $xss "${xss}1"; }
    if ($request_uri ~* "document\.cookie") { set $xss "${xss}1"; }
    if ($xss = "11111") { return 403; }

    # 限制HTTP方法
    if ($request_method !~ ^(GET|POST)$ ) {
        return 405;
    }

    location / {
        # 其他配置...
        proxy_pass http://backend;
    }

    # 记录XSS尝试
    error_log /var/log/nginx/xss_error.log;
}

通过以上Nginx配置策略,可以显著提高网站对XSS攻击的防御能力,但需注意这应与应用层的安全措施配合使用,形成纵深防御体系。