1. 为什么需要HTTP安全头?

当我们在浏览器访问网站时,HTTP响应头就像快递包裹上的"运输标签",告诉浏览器如何处理内容。安全头就是这些标签中标注"易碎品"和"禁止倒置"的重要提示,它能:

  • 阻止浏览器执行危险操作(例如加载恶意脚本)
  • 防御跨站脚本攻击(XSS)
  • 防止点击劫持攻击
  • 控制资源加载策略

去年某电商平台就曾因为缺失Content-Security-Policy头部,导致攻击者通过商品评价模块注入恶意代码,造成用户数据泄露。通过正确配置安全头,这种风险可以降低80%以上。

2. Nginx配置基础准备

2.1 环境确认

确保已安装Nginx并具备配置文件修改权限:

# 查看Nginx版本(演示环境使用Nginx 1.18.0)
nginx -v

# 配置文件路径示例
/etc/nginx/nginx.conf
/etc/nginx/conf.d/security_headers.conf

2.2 配置文件结构

建议在server块内或单独配置文件中添加安全头:

server {
    listen 80;
    server_name example.com;
    
    # 安全头配置区域
    add_header X-Content-Type-Options "nosniff" always;
    
    location / {
        # 其他配置...
    }
}

3. 核心安全头配置详解

3.1 X-Content-Type-Options

作用:防止浏览器猜测内容类型(MIME嗅探)

add_header X-Content-Type-Options "nosniff" always;
# 参数说明:
# "nosniff" - 强制浏览器遵循Content-Type定义
# always    - 确保所有响应都包含该头(包括错误响应)

3.2 X-Frame-Options

防御场景:阻止页面被嵌入iframe框架(防点击劫持)

add_header X-Frame-Options "SAMEORIGIN" always;
# 可选值:
# DENY           - 完全禁止嵌入
# SAMEORIGIN     - 仅允许同源网站嵌入
# ALLOW-FROM uri - 指定允许的域名(部分浏览器已废弃)

3.3 Content-Security-Policy(CSP)

安全等级:⭐⭐⭐⭐⭐

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; img-src 'self' data:; style-src 'self' 'unsafe-inline';" always;
# 策略说明:
# default-src   - 默认资源加载策略
# script-src    - 控制JavaScript来源
# 'unsafe-inline' - 允许内联样式(需谨慎使用)
# data:         - 允许Base64图片

3.4 Strict-Transport-Security(HSTS)

注意事项:需先启用HTTPS

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 参数详解:
# max-age=31536000 - 有效期1年(单位:秒)
# includeSubDomains - 包含所有子域名
# preload          - 申请加入浏览器预加载列表

3.5 X-XSS-Protection(兼容旧浏览器)

add_header X-XSS-Protection "1; mode=block" always;
# 现代浏览器已逐步淘汰该头,建议配合CSP使用

4. 高级配置技巧

4.1 动态CSP配置

使用Nginx变量实现环境差异配置:

map $host $csp_policy {
    default      "default-src 'self';";
    staging      "default-src 'self' 'unsafe-inline';";
}

server {
    add_header Content-Security-Policy $csp_policy;
}

4.2 安全头例外处理

对特定路径禁用安全头:

location /legacy-system/ {
    add_header X-Content-Type-Options "";
    add_header Content-Security-Policy "";
    # 空值会覆盖上级配置
}

4.3 安全头验证工具

配置完成后使用以下工具验证:

# 使用curl检查响应头
curl -I https://example.com

# 在线验证工具
https://securityheaders.com

5. 关联技术:SSL/TLS配置

虽然不属于安全头范畴,但安全传输层配置同样重要:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

6. 应用场景分析

6.1 电商网站

重点关注

  • CSP防止支付页面被注入恶意脚本
  • X-Frame-Options阻止钓鱼网站嵌套

6.2 内容管理系统(CMS)

特殊处理

  • 放宽style-src策略允许富文本编辑器
  • 配置report-uri收集CSP违规报告

6.3 静态资源站点

优化方向

  • 设置长期缓存头(Cache-Control)
  • 同时保持安全头配置

7. 技术优缺点对比

安全头 优点 缺点
CSP 细粒度控制资源加载 学习曲线陡峭
HSTS 强制HTTPS连接 配置错误会导致服务中断
X-Frame-Options 简单易用 不支持多域名白名单

8. 注意事项清单

  1. 测试环境先行:先在测试环境验证配置,避免生产环境故障
  2. 渐进式CSP策略:先使用Content-Security-Policy-Report-Only模式
  3. 浏览器兼容性:旧版IE浏览器可能不支持部分安全头
  4. 头信息冲突:避免多个位置重复设置相同头部
  5. 性能影响:过多安全头可能增加响应包大小(平均增加2-5KB)

9. 配置方案总结

推荐的基础配置模板:

# 基础安全头套餐
add_header X-Content-Type-Options    "nosniff"          always;
add_header X-Frame-Options           "SAMEORIGIN"       always;
add_header X-XSS-Protection          "1; mode=block"    always;
add_header Referrer-Policy           "strict-origin"    always;

# CSP标准配置(需根据业务调整)
add_header Content-Security-Policy  "default-src 'self'; script-src 'self' 'unsafe-inline' https:; img-src 'self' data:; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'" always;

# HSTS增强配置
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

10. 常见问题排查

问题现象:CSS文件加载失败 可能原因:CSP策略过于严格

# 错误配置
add_header Content-Security-Policy "style-src 'self'";

# 正确调整(允许内联样式)
add_header Content-Security-Policy "style-src 'self' 'unsafe-inline'";

问题现象:浏览器提示"HSTS错误" 解决方案

  1. 检查证书有效性
  2. 临时降低max-age值
  3. 通过chrome://net-internals/#hsts 清除HSTS缓存