每个网站都应发送的安全响应头

Security2026-09-19TryQuickToolBox

您已经加固了服务器、修补了框架,并对团队进行了安全编码培训。但如果您的网站没有发送正确的 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; preload

max-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强制 HTTPSmax-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)验证您的响应头。检查:

随着网站的发展,定期审查和更新您的策略。

常见问题

最重要的安全响应头是什么?

Content-Security-Policy 通常被认为是最重要的,因为它直接缓解 XSS 和数据注入攻击,这些是最常见的 Web 漏洞之一。

安全响应头能替代其他安全措施吗?

不能。安全响应头是纵深防御的一层。您仍然需要安全编码、输入验证、身份验证和其他最佳实践。

添加安全响应头会破坏我的网站吗?

如果配置错误,尤其是 CSP,它们可能会阻止合法资源。在部署到生产环境之前,请始终在暂存环境中测试,并监控浏览器控制台是否有违规。

准备好锁定您的网站了吗?从添加上面的响应头开始,然后使用浏览器的开发者工具进行测试。想要快速检查和格式化来自安全扫描器的 JSON 响应,试试我们的 JSON Formatter。