为什么需要安全响应头

HTTP 安全响应头告诉浏览器如何安全地处理网站内容。配置得当可以防御多种常见攻击。

Nginx 完整安全头配置

# /etc/nginx/nginx.conf 或站点配置的 server 块

# === 核心安全头 ===

# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;

# 防止 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff" always;

# 启用 XSS 过滤(已废弃但向下兼容)
add_header X-XSS-Protection "0" always;

# 控制引荐来源信息
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# 权限控制(限制 API 访问)
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), interest-cohort=()" always;

# === HSTS(HTTP Strict Transport Security)===
# 确认 HTTPS 正常工作后再启用
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

# === CSP(Content Security Policy)===
# 根据实际需求调整,过于严格可能影响功能
add_header Content-Security-Policy "
  default-src 'self';
  script-src 'self' 'unsafe-inline' 'unsafe-eval' https:;
  style-src 'self' 'unsafe-inline' https:;
  img-src 'self' data: https:;
  font-src 'self' data: https:;
  connect-src 'self' https:;
  frame-ancestors 'self';
  form-action 'self';
  base-uri 'self';
" always;

Apache 配置

# .htaccess 或 httpd.conf

# 核心安全头
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

各安全头说明

响应头 作用 推荐值 风险
X-Frame-Options 防止点击劫持(页面被嵌入 iframe) SAMEORIGIN
X-Content-Type-Options 防止 MIME 嗅探攻击 nosniff
Strict-Transport-Security 强制 HTTPS 连接 max-age=63072000; includeSubDomains
Referrer-Policy 控制 HTTP Referer 头信息 strict-origin-when-cross-origin
Permissions-Policy 控制浏览器 API 权限 按需限制
Content-Security-Policy 防止 XSS 和数据注入 按站点配置

CSP 配置指南

宽松策略(适合大多数网站)

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

严格策略(适合安全敏感站点)

add_header Content-Security-Policy "
  default-src 'none';
  script-src 'self';
  style-src 'self';
  img-src 'self';
  connect-src 'self';
  frame-ancestors 'none';
  form-action 'self';
  base-uri 'self';
" always;

验证工具

  • securityheaders.com — 安全头评级
  • CSP Evaluator — CSP 策略评估
  • SSL Labs — SSL/TLS 配置评级
  • curl -sI https://example.com | grep -i "^\(x-\|strict\|content\|referrer\|permissions\)" — 本地检查

配置检查清单

  • X-Frame-Options: SAMEORIGIN
  • X-Content-Type-Options: nosniff
  • Strict-Transport-Security 已配置
  • Referrer-Policy 已配置
  • Permissions-Policy 已配置
  • Content-Security-Policy 已配置并测试
  • securityheaders.com 评级 A 或 A+
  • 配置后测试网站功能正常