加密与安全通信

安全头

约 5 分钟阅读

什么是安全头

安全头 (Security Headers) 是 Web 服务器在 HTTP 响应中附加的头部,用于指示浏览器执行安全相关的行为。正确配置可以显著缓解 XSS点击劫持和 MIME 嗅探等攻击。

安全头是一种"低成本、高回报"的措施 - - 无需修改应用代码,仅通过服务器或 CDN 配置即可启用。但错误的设置 (尤其是 CSP) 可能破坏网站功能,因此仔细测试至关重要。

主要安全头

  • Content-Security-Policy (CSP):限制页面可加载资源 (脚本、样式、图片、字体等) 的来源。阻止内联脚本执行可大幅减少 XSS 攻击。最强大的头部,但配置复杂,现有网站引入需谨慎测试。
  • Strict-Transport-Security (HSTS):强制浏览器始终对该域名使用 HTTPS。防止试图降级到 HTTP 的中间人攻击includeSubDomains 指令将策略应用于所有子域名,preload 可加入浏览器内置 HSTS 列表。
  • X-Content-Type-Options:设置 nosniff 防止浏览器猜测 (嗅探) MIME 类型。阻止将文本文件当作 JavaScript 执行的攻击。
  • X-Frame-Options:控制页面是否可以嵌入 iframe。设置 DENYSAMEORIGIN 防止点击劫持攻击。正在被 CSP 的 frame-ancestors 指令取代。
  • Referrer-Policy:控制导航到其他网站时发送多少引用来源信息。strict-origin-when-cross-origin 是平衡的设置,跨域请求仅发送来源。
  • Permissions-Policy:控制浏览器功能 (摄像头、麦克风、地理位置等) 的访问。禁用未使用的功能可减少攻击面。

安全头的配置方法

安全头通过 Web 服务器或反向代理配置添加。

Nginx 配置示例

add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

CloudFront (AWS) 配置

使用响应头策略添加安全头。可从 CloudFront 控制台或 CloudFormation 配置,无需修改源服务器。

验证工具

securityheaders.com:输入 URL 即可获得安全头配置的评级 (A+ 到 F)。还提供缺失头部的具体建议。

实施注意事项与优先顺序

不需要一次性实施所有头部。建议按以下优先顺序分阶段引入。

  1. 立即实施 (副作用最小):X-Content-Type-Options、X-Frame-Options、Referrer-Policy
  2. 尽早实施 (需要 HTTPS):HSTS。从较短的 max-age 开始,逐步延长。preload 指令需谨慎 - - 一旦注册,移除很困难。
  3. 谨慎实施 (需要测试):CSP。先使用 Content-Security-Policy-Report-Only 收集违规报告而不阻止。根据报告逐步收紧策略。

添加头部后,务必使用 securityheaders.com 和浏览器开发者工具验证。特别注意 CSP,过于严格的策略可能破坏第三方脚本、广告投放和分析工具。

常见误解

有了 HTTPS 就不需要安全头
HTTPS 提供通信通道加密,但无法防止 XSS 和点击劫持等应用层攻击。安全头与 HTTPS 在不同层面进行防御,两者需要配合使用。
设置安全头会导致页面显示异常
X-Content-Type-Options 和 X-Frame-Options 几乎没有副作用。最可能影响显示的是 CSP,但使用 Report-Only 模式进行预测试可以安全引入。
分享

相关术语