Skip to content

防止XSS攻击

防止XSS(跨站脚本)攻击,保护用户安全。

基本防护

安全头

nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;

禁止内联脚本

nginx
location ~* \.(html|htm)$ {
    if ($args ~* "<script") {
        return 403;
    }
}

完整配置

XSS防护

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

    root /var/www/html;

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

    # 禁止内联脚本
    location ~* \.(html|htm)$ {
        if ($args ~* "<script") {
            return 403;
        }

        try_files $uri $uri/ =404;
    }
}

CSP(内容安全策略)

基本CSP

nginx
add_header Content-Security-Policy "default-src 'self'" always;

完整CSP

nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-src 'self';" always;

CSP指令说明

default-src

  • 默认资源加载策略
  • 'self':仅允许同源

script-src

  • 脚本加载策略
  • 'unsafe-inline':允许内联脚本

style-src

  • 样式加载策略
  • 'unsafe-inline':允许内联样式

img-src

  • 图片加载策略
  • data::允许data URL

常见XSS攻击模式

脚本注入

nginx
if ($args ~* "<script") {
    return 403;
}

事件注入

nginx
if ($args ~* "onerror|onload|onclick") {
    return 403;
}

JavaScript伪协议

nginx
if ($args ~* "javascript:") {
    return 403;
}

完整示例

生产环境配置

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

    root /var/www/html;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-src 'self';" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # XSS防护
    location ~* \.(html|htm)$ {
        if ($args ~* "<script|onerror|onload|onclick|javascript:") {
            return 403;
        }

        try_files $uri $uri/ =404;
    }
}

常见问题

正常脚本被拦截

原因: CSP策略过于严格

解决: 调整CSP策略

nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'" always;

XSS攻击未拦截

原因: 正则表达式不完整

解决: 添加更多XSS模式

nginx
if ($args ~* "<script|onerror|onload|onclick|javascript:") {
    return 403;
}

总结

防止XSS攻击的关键点:

  • 安全头:X-Frame-Options、X-Content-Type-Options、X-XSS-Protection
  • CSP:内容安全策略
  • 禁止内联脚本:过滤script标签
  • 禁止事件:过滤onerror、onload等事件
  • 禁止JavaScript伪协议:过滤javascript:

合理配置XSS防护,保护用户安全。