每个网站都应发送的安全响应头
您已经加固了服务器、修补了框架,并对团队进行了安全编码培训。但如果您的网站没有发送正确的 HTTP 安全响应头,它仍然存在漏洞。这些响应头告诉浏览器在处理您的内容时应该如何行为,而缺失或配置错误的响应头会为跨站脚本(XSS)、点击劫持、协议降级攻击和数据泄露敞开大门。
在本指南中,我们将介绍每个网站都应发送的关键安全响应头,解释每个响应头的作用,并向您展示如何正确配置它们。
为什么安全响应头很重要
安全响应头是第一道防线,因为它们强制执行您可控的浏览器级策略。它们不能替代输入验证或安全身份验证,但能显著减少攻击面。例如,严格的 Content-Security-Policy 可以阻止注入的脚本执行,即使攻击者发现了 XSS 漏洞。
主流浏览器一致支持这些响应头,添加它们通常只需几行配置。几乎没有理由不使用它们。
关键安全响应头
以下是每个生产网站都应发送的响应头。我们将介绍它们的作用、推荐值和常见陷阱。
1. Content-Security-Policy (CSP)
CSP 是缓解 XSS 和数据注入最强大的响应头。它限制浏览器可以从哪些来源加载脚本、样式、图像和其他资源。一个好的起始策略可能如下:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://images.example.com; object-src 'none'; base-uri 'self'; form-action 'self';从 default-src 'self' 开始,根据需要逐步添加例外。如果可能,避免为脚本使用 'unsafe-inline';改用 nonce 或哈希。请彻底测试,因为配置错误的 CSP 可能会破坏您的网站。
2. HTTP Strict Transport Security (HSTS)
HSTS 强制浏览器对您域名的所有未来请求使用 HTTPS。它防止协议降级攻击和 cookie 劫持。典型响应头:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadmax-age 以秒为单位(一年)。includeSubDomains 将策略应用于所有子域名。preload 允许您的域名被添加到浏览器预加载列表,但只有您绝对确定所有子域名都支持 HTTPS 时才使用它。
3. X-Frame-Options
此响应头防止您的网站被嵌入 iframe,从而阻止点击劫持攻击。使用:
X-Frame-Options: DENY或者如果您需要在自己的内容中嵌入框架,可以使用 SAMEORIGIN。现代浏览器还支持 CSP 中的 frame-ancestors 指令,它更灵活。如果您使用 CSP,可以省略 X-Frame-Options,但同时包含两者可提供更好的兼容性。
4. X-Content-Type-Options
此响应头阻止浏览器对响应进行 MIME 嗅探,偏离声明的 Content-Type。它简单且有效:
X-Content-Type-Options: nosniff没有它,恶意文件可能被解释为可执行脚本。请始终设置它。
5. Referrer-Policy
Referrer-Policy 控制随请求发送多少 referrer 信息。一个平衡的默认值:
Referrer-Policy: strict-origin-when-cross-origin这会为同源请求发送完整 URL,为跨源请求只发送源。它减少了敏感路径信息的泄露,同时保留分析功能。
6. Permissions-Policy
以前称为 Feature-Policy,此响应头允许您启用或禁用地理位置、摄像头和麦克风等浏览器功能。示例:
Permissions-Policy: geolocation=(), camera=(), microphone=()禁用未使用的功能可减少受损第三方脚本的影响。
安全响应头对比
| 响应头 | 目的 | 推荐值 |
|---|---|---|
| Content-Security-Policy | 缓解 XSS 和数据注入 | default-src 'self'; script-src 'self' ... |
| Strict-Transport-Security | 强制 HTTPS | max-age=31536000; includeSubDomains |
| X-Frame-Options | 防止点击劫持 | DENY 或 SAMEORIGIN |
| X-Content-Type-Options | 阻止 MIME 嗅探 | nosniff |
| Referrer-Policy | 控制 referrer 泄露 | strict-origin-when-cross-origin |
| Permissions-Policy | 限制浏览器功能 | geolocation=(), camera=() |
如何添加安全响应头
方法取决于您的 Web 服务器或框架。以下是常见方法。
Nginx
在 server 块中添加响应头:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://images.example.com; object-src 'none'; base-uri 'self'; form-action 'self';" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;always 参数确保即使在错误响应中也发送响应头。
Apache
启用 mod_headers 并添加:
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://images.example.com; object-src 'none'; base-uri 'self'; form-action 'self';"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), camera=(), microphone=()"Node.js (Express)
使用 helmet 中间件,它默认设置许多响应头:
const helmet = require('helmet');
app.use(helmet());
// 如果需要,自定义 CSP
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "https://trusted.cdn.com"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https://images.example.com"],
objectSrc: ["'none'"],
baseUri: ["'self'"],
formAction: ["'self'"],
}
}));Helmet 默认还会设置其他响应头,如 X-Content-Type-Options 和 Referrer-Policy。
测试您的响应头
部署后,使用浏览器开发者工具(网络选项卡)或在线扫描器(如 SecurityHeaders.com)验证您的响应头。检查:
- 所有推荐的响应头都存在。
- CSP 没有阻止合法资源(检查控制台是否有违规)。
- 仅在 HTTPS 完全正常工作时才启用 HSTS。
- 错误页面也发送响应头。
随着网站的发展,定期审查和更新您的策略。
常见问题
最重要的安全响应头是什么?
Content-Security-Policy 通常被认为是最重要的,因为它直接缓解 XSS 和数据注入攻击,这些是最常见的 Web 漏洞之一。
安全响应头能替代其他安全措施吗?
不能。安全响应头是纵深防御的一层。您仍然需要安全编码、输入验证、身份验证和其他最佳实践。
添加安全响应头会破坏我的网站吗?
如果配置错误,尤其是 CSP,它们可能会阻止合法资源。在部署到生产环境之前,请始终在暂存环境中测试,并监控浏览器控制台是否有违规。
准备好锁定您的网站了吗?从添加上面的响应头开始,然后使用浏览器的开发者工具进行测试。想要快速检查和格式化来自安全扫描器的 JSON 响应,试试我们的 JSON Formatter。