HTTP 安全标头完整指南:CSP、HSTS、X-Frame-Options 等
HTTP 安全标头是保护您的网站免受 XSS、CSRF 和点击劫持等攻击的强大机制。尽管它们很重要,但大多数网站都没有正确实施它们,导致用户数据容易受到攻击。本指南详细解释了每个标头、如何配置它们,以及如何验证它们在您的网站上是否正常工作。
目录
什么是 HTTP 安全标头?为什么每个网站都需要它们
HTTP 安全标头是服务器在 HTTP 响应中发送的指令,用于告诉浏览器如何处理安全问题。它们可以防护 XSS 攻击、MIME 嗅探、点击劫持和推荐信息泄露。这些标头充当额外的安全层,即使您已经加强了代码的安全性,也能额外提升信心,确保攻击者无法轻易破坏您的用户。
- 通过控制允许哪些内容源来防止 XSS 攻击
- 使用 HSTS 在整个网站上强制执行 HTTPS
- 通过限制 iframe 嵌入来阻止点击劫持
- 控制推荐数据泄露到其他网站
- 防止浏览器执行不安全的 MIME 类型嗅探
- 限制不受信任的源对插件、麦克风和摄像头的访问
Content-Security-Policy (CSP) – 细粒度内容控制
Content-Security-Policy 是防止 XSS 攻击的最强大的标头。它允许您指定哪些域可以加载脚本、样式表、图像、字体和其他资源。CSP 可以强制执行限制或在仅报告模式下运行,以警告您违反情况而不会破坏功能。在强制执行政策之前,先从仅报告模式开始测试政策。
- default-src 'self' 仅限资源来自您的域
- script-src 控制 JavaScript 可以从何处加载
- style-src 将 CSS 源限制在批准的位置
- img-src 指定哪些域可以提供图像
- font-src 将字体加载限制为受信任的源
- frame-ancestors 'none' 防止点击劫持攻击
HSTS(严格传输安全)– 始终强制执行 HTTPS
HSTS 告诉浏览器始终通过 HTTPS 连接到您的网站,即使用户键入 HTTP URL 或点击旧链接。它可以防止降级攻击和中间人拦截。该标头包括 max-age(浏览器记住此政策的时间长度)和可选的 includeSubDomains 指令,该指令将政策扩展到所有子域。
- 防止由于网络拦截而从 HTTPS 降级到 HTTP
- 告诉浏览器如果配置,要记住此政策多年
- 可选的 includeSubDomains 将保护扩展到所有子域
- 减少每次访问时冗余的 301 HTTP-to-HTTPS 重定向
- 防止对未加密流量的窃听和篡改
X-Content-Type-Options 和 X-Frame-Options – 防止 MIME 嗅探和点击劫持
X-Content-Type-Options: nosniff 告诉浏览器信任您发送的 Content-Type 标头,不要猜测文件类型。如果没有它,浏览器可能会将文件解释为 HTML,尽管您明确指定了内容类型。X-Frame-Options: DENY 防止您的网站被嵌入到其他网站的 iframe 中,阻止点击劫持攻击,其中隐藏的按钮欺骗用户执行无意的操作。
- X-Content-Type-Options: nosniff 完全阻止 MIME 嗅探攻击
- X-Frame-Options: DENY 防止您网站的所有 iframe 嵌入
- X-Frame-Options: SAMEORIGIN 仅允许来自您自己域的 iframe 嵌入
- X-Frame-Options: ALLOW-FROM(已弃用)曾用于白名单其他受信任的域
- 这两个标头简单但对阻止常见攻击极其有效
Referrer-Policy 和 Permissions-Policy – 控制推荐信息和浏览器功能
Referrer-Policy 控制将多少推荐信息(用户来自的 URL)发送到其他网站。例如,strict-origin-when-cross-origin 仅发送域名,不发送完整 URL 或查询参数。Permissions-Policy(以前称为 Feature-Policy)限制脚本和第三方 iframe 访问敏感的浏览器 API,如摄像头、麦克风、位置和支付请求。
- Referrer-Policy: strict-origin-when-cross-origin 仅在跨源时发送域
- Referrer-Policy: no-referrer 防止发送所有推荐信息
- Referrer-Policy: same-origin 仅在您自己的站点内发送推荐信息
- Permissions-Policy: camera=() 禁用脚本访问摄像头
- Permissions-Policy: geolocation=() 防止位置跟踪
- Permissions-Policy: payment=() 阻止支付请求 API 访问
如何添加安全标头 – Apache .htaccess 和 Nginx 示例
向您的网站添加标头很简单。在 Apache 上,将指令添加到根目录中的 .htaccess 文件。在 Nginx 上,编辑 nginx.conf 或虚拟服务器配置文件。如果您使用 PHP,可以使用 header() 函数添加标头,但必须在任何 HTML 输出之前执行。首先使用 X-Content-Type-Options 和 X-Frame-Options 等简单标头,然后逐步添加更复杂的 CSP。
- Apache:在 .htaccess 中的
块中包装指令 - Nginx:在您的 server {} 块内添加标头指令
- PHP:使用 header() 函数但将其放在任何输出之前
- 在进行复杂的 CSP 之前先从简单的标头开始
- 在强制执行政策前在仅报告模式中测试
- 重启您的服务器或重新加载配置文件以应用更改
使用在线扫描工具测试您的标头
设置标头后,进行测试以确保浏览器实际接收到它们。几个免费的在线工具可以扫描您的标头并提供安全评分。最简单的方法是打开浏览器的开发者工具 (F12),转到"网络"选项卡,并检查您的网站发送的响应标头。您也可以使用 curl 命令行工具来获取标头,而无需加载整个页面。
- 使用免费的在线标头扫描工具一次检查所有标头
- 打开开发者工具 (F12) 并导航到"网络"选项卡
- 检查每个页面加载的响应标头
- 从终端使用 curl 快速检查标头
- 监视浏览器控制台中的 Content-Security-Policy 违反错误
- 如果测试显示缺少或不正确的指令,请调整标头
导致网站损坏的常见 CSP 错误
过于严格的 CSP 政策经常会破坏网站的部分内容 – 脚本无法加载、样式消失或 iframe 无法呈现。常见的错误包括忘记在 script-src 中白名单公共 CDN 域、使用降低安全性的 'unsafe-inline'、忘记允许 base64 编码图像的 data: URL,或关闭 default-src 但忘记其他指令。当出现问题时,使用仅报告模式通过控制台错误诊断问题,然后逐步放松政策。
- 忘记在 script-src 中白名单 CDN 域
- 使用违反 CSP 目的的 'unsafe-inline'
- 未能为嵌入的图像或字体允许 data: URL
- 阻止 default-src 但忘记其他源指令
- 在强制执行严格政策之前未检查控制台错误
- 首先使用仅报告模式来测试和调整政策
- 逐步收紧政策而不是放松得太快
安全标头与 SSL 证书 – 它们分别实际保护什么
SSL 证书和安全标头防护不同的威胁。SSL 加密浏览器和服务器之间的数据,防止窃听和网络级中间人攻击。安全标头在数据安全到达后通过告诉浏览器防止 XSS、CSRF、点击劫持和功能滥用来工作。您需要两者:SSL 用于加密,安全标头用于应用程序级防御。没有两者,您的网站就有漏洞。
- SSL 证书加密传输中的数据以防止网络拦截
- 安全标头防止应用程序级攻击,如 XSS 和 CSRF
- SSL 防止 ISP 和 Wi-Fi 网络窃听
- CSP 防止注入攻击,即使 SSL 配置正确
- HSTS 强制执行 HTTPS 但无法修复易受攻击的应用程序代码
- SSL 证书和安全标头对完整保护至关重要
常见问题
安全标头会影响我的 SEO 排名吗?
不会直接影响,但 HSTS 等标头可以通过减少重定向链来改进性能,这有助于 SEO。CSP 和其他标头表示网站的安全性,Google 等搜索引擎在对类似页面进行排名时可能会略微考虑这一点。主要好处是用户安全,任何 SEO 好处都是次要但受欢迎的。
添加 CSP 会破坏我的网站吗?
如果配置不正确,可能会。这就是为什么您首先要从仅报告模式开始,该模式记录违反情况而不实际阻止内容。查看控制台错误,调整您的政策,然后切换到强制执行模式。遵循这种渐进方法可以防止破坏您的网站。
HSTS 和 SSL 证书之间的区别是什么?
SSL 证书在传输层加密流量。HSTS 告诉浏览器始终通过 HTTPS 连接。它们一起工作 – 您首先需要一个有效的 SSL 证书,然后 HSTS 确保浏览器保持在 HTTPS 上。没有 SSL,HSTS 无效。
我如何测试我的网站已经有哪些安全标头?
打开浏览器的开发者工具 (F12),转到"网络"选项卡,重新加载您的页面,然后检查"响应标头"部分。您会看到 Content-Security-Policy、Strict-Transport-Security 和其他您已配置的标头。免费的在线标头扫描工具也会抓取您的网站并全面评分其安全性。
安全标头会减慢页面加载吗?
不会。标头是简单的文本指令,需要最少的服务器资源。即使是复杂的 CSP 也只影响浏览器,不影响服务器性能。安全好处远超过任何性能问题。实际上,HSTS 可以减少重定向链,实际上加快了页面加载。