本文目录导读:

配置安全的HTTP头是提升Web应用安全性的重要手段,可以有效防御XSS、点击劫持、MIME类型嗅探等常见攻击,以下是核心安全HTTP头的配置指南及示例(适用于Nginx、Apache等常见服务器)。
核心安全HTTP头清单
| HTTP头 | 作用 | 推荐值 |
|---|---|---|
Strict-Transport-Security |
强制HTTPS连接,防止SSL剥离 | max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
防止浏览器MIME类型嗅探 | nosniff |
X-Frame-Options |
防止点击劫持(页面被嵌入iframe) | DENY 或 SAMEORIGIN |
X-XSS-Protection |
启用浏览器XSS过滤器(部分现代浏览器已废弃,但仍推荐兼容) | 1; mode=block |
Content-Security-Policy |
控制资源加载来源,防御XSS和数据注入 | 按需配置(见下文示例) |
Referrer-Policy |
控制referrer信息的发送 | strict-origin-when-cross-origin |
Permissions-Policy |
限制浏览器API权限(如摄像头、麦克风) | camera=(), microphone=(), geolocation=() |
Cache-Control |
控制缓存策略,防止敏感信息缓存 | no-store, no-cache, must-revalidate (对动态/敏感页面) |
配置示例(按服务器类型)
Nginx (在 server 或 location 块中添加)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "DENY" always; add_header X-XSS-Protection "1; mode=block" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
Apache (在 .htaccess 或 httpd.conf 中添加)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "DENY" Header always set X-XSS-Protection "1; mode=block" Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
IIS (通过 web.config)
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" />
<add name="X-Content-Type-Options" value="nosniff" />
<add name="X-Frame-Options" value="DENY" />
<add name="X-XSS-Protection" value="1; mode=block" />
<add name="Content-Security-Policy" value="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'self'" />
<add name="Referrer-Policy" value="strict-origin-when-cross-origin" />
<add name="Permissions-Policy" value="camera=(), microphone=(), geolocation=(), payment=()" />
</customHeaders>
</httpProtocol>
</system.webServer>
Node.js (Express)
const helmet = require('helmet');
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:"],
objectSrc: ["'none'"],
frameAncestors: ["'none'"],
baseUri: ["'self'"]
}
},
referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
// 其他选项默认即可
}));
// 注:helmet 默认已包含大部分安全头,以上为定制示例
Content-Security-Policy (CSP) 配置要点
CSP配置需要根据实际资源加载情况调整,避免误伤,典型配置模板:
Content-Security-Policy: default-src 'self'; # 默认只信任同源 script-src 'self' https://trusted.cdn.com; # 允许特定CDN的脚本 style-src 'self' 'unsafe-inline'; # 允许内联样式(如需) img-src 'self' data: https://images.example.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; # XMLHttpRequest、WebSocket等 frame-ancestors 'none'; # 禁止被嵌入任何iframe base-uri 'self'; # 限制<base>标签 form-action 'self'; # 限制表单提交目标 upgrade-insecure-requests; # 自动升级HTTP到HTTPS(可选)
重要:CSP配置应逐步放宽,先在report-only模式下测试(Content-Security-Policy-Report-Only),确认无违规后再启用强制策略。
检查与调试工具
- 在线检查:访问 securityheaders.com,输入你的域名获得评分和详细报告。
- 浏览器开发者工具:在“网络”标签查看响应头,确认所有头已正确返回。
- curl命令:
curl -I https://yourdomain.com
注意事项与常见误区
- 不要直接复制生产:CSP策略需根据实际的前端资源(如第三方CDN、内联脚本)定制,否则可能导致页面功能失效。
- HSTS预加载:如果申请HSTS预加载,需确保全站HTTPS且无子域名降级。
- X-XSS-PROTECTION已废弃:Chrome已移除对
X-XSS-Protection的支持,但保留以兼容旧浏览器。 - Permissions-Policy:相比
Feature-Policy(已弃用),使用新规范Permissions-Policy。 - 避免过度限制:如网站使用了iframe(如支付页面),
X-Frame-Options应设为SAMEORIGIN而非DENY。 - 缓存风险:对静态资源可设置
Cache-Control: public, max-age=31536000,但对敏感页面(如后台、个人资料)必须禁止缓存。
总结建议
- 最低安全配置:先启用
Strict-Transport-Security、X-Content-Type-Options、X-Frame-Options、Referrer-Policy,这些几乎不会影响功能。 - 逐步引入CSP:从
Content-Security-Policy-Report-Only开始,收集违规报告,再转为强制策略。 - 定期审计:使用自动化工具(如 Mozilla Observatory、Nmap NSE脚本)定期检查安全头配置。
正确配置后,可显著提升网站对XSS、点击劫持、中间人攻击等威胁的防御能力。