×

HTTP 安全头部深度解析:CSP、HSTS 到完整防护配置

HTTP 安全头部是浏览器与服务器之间的“安全协议”——它们告诉浏览器应该如何处理页面内容,能有效防御 XSS、点击劫持、MIME 嵅探等常见攻击。

HTTP 安全头分层防护示意图
示意图: HTTP 安全头分层防护示意图

一、为什么安全头部重要

  • 阻止恶意脚本 → Content-Security-Policy
  • 强制 HTTPS → Strict-Transport-Security
  • 防止 iframe 嵌入 → X-Frame-Options

二、关键安全头部详解

1. Content-Security-Policy (CSP)

CSP 是最强大也最复杂的安全头部。它白名单化页面允许加载的资源来源。

# 基础 CSP:仅允许同源资源 + Google Analytics + Google AdSense
Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://www.googletagmanager.com https://pagead2.googlesyndication.com;
  style-src 'self' 'unsafe-inline';
  img-src 'self' data: https:;
  font-src 'self' https://fonts.gstatic.com;
  connect-src 'self' https://www.google-analytics.com;
  frame-src https://googleads.g.doubleclick.net;
⚠️ 注意:CSP 配置错误会直接导致页面功能异常(JS 不加载、图片不显示、字体丢失)。建议先用 Content-Security-Policy-Report-Only 模式测试,确认无误后再切换为强制模式。

2. Strict-Transport-Security (HSTS)

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
# max-age=31536000  → 缓存 1 年
# includeSubDomains → 所有子域也强制 HTTPS
# preload           → 可申请加入浏览器预加载列表

3. X-Frame-Options

X-Frame-Options: DENY           # 完全禁止被嵌入
X-Frame-Options: SAMEORIGIN     # 只允许同源嵌入

4. 其他重要头部

头部作用推荐值
X-Content-Type-Options禁止 MIME 嵅探nosniff
Referrer-Policy控制 Referer 泄露strict-origin-when-cross-origin
Permissions-Policy控制浏览器 APIcamera=(), microphone=()

三、有无安全头部对比

攻击无安全头有安全头
XSS脚本直接执行CSP 阻止
点击劫持可被任意 iframe 嵌入X-Frame-Options 阻止
协议降级中间人可劫持HSTS 强制 HTTPS
MIME 混淆文本可能被当脚本nosniff 禁止

四、Nginx 完整配置

server {
    listen 443 ssl http2;
    server_name example.com;

    # 安全头部
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    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 Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;" always;

    # 隐藏服务器版本
    server_tokens off;
}

五、如何检测

# curl 查看响应头
curl -I https://example.com

# 浏览器 DevTools
# → Network → 点击任意请求 → Response Headers

# 在线工具
# ipinfo.im HTTP Headers 检测工具 — 一键查看所有响应头

六、常见误区

误区 1:“用了 HTTPS 就不需要安全头部” — HTTPS 只加密传输,不防浏览器层攻击。

误区 2:“安全头部影响性能” — 只是几行文本,影响为零。

误区 3:“配置一次就不用管” — CSP 需随业务变化更新。