HTTP安全头部配置
约 1712 字大约 6 分钟
securityheaders
2025-08-23
概述
HTTP 安全头部是服务器通过响应头告知浏览器应用安全策略的机制。正确配置安全头部可以有效防御 XSS、点击劫持、MIME 嗅探、信息泄露等常见攻击。这些安全头的配置成本极低,但安全收益显著。
安全头部全景
Strict-Transport-Security (HSTS)
强制浏览器使用 HTTPS 连接,防止 SSL Stripping 降级攻击。
# 推荐配置
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload| 参数 | 说明 |
|---|---|
max-age=31536000 | HSTS 有效期,1 年(秒数) |
includeSubDomains | 所有子域名也强制 HTTPS |
preload | 申请加入浏览器 HSTS 预加载列表 |
# Nginx 配置
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
}注意:HSTS preload 提交后很难撤销。确保所有子域名都支持 HTTPS 后再启用
includeSubDomains和preload。
X-Content-Type-Options
防止浏览器进行 MIME 类型嗅探,强制使用服务器声明的 Content-Type。
X-Content-Type-Options: nosniffX-Frame-Options
控制页面是否可以被 iframe 嵌入,防止点击劫持(Clickjacking)。
# 完全禁止嵌入
X-Frame-Options: DENY
# 仅允许同源嵌入
X-Frame-Options: SAMEORIGIN注意:
X-Frame-Options已被 CSP 的frame-ancestors指令取代,但为了兼容旧浏览器,建议同时设置两者。
# 推荐:同时设置
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none';
# 或允许同源
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self';Referrer-Policy
控制请求的 Referer 头中包含多少信息。
# 推荐:同源完整 URL,跨域仅发送 origin
Referrer-Policy: strict-origin-when-cross-origin| 策略 | 同源请求 | 跨域 HTTPS->HTTPS | 降级 HTTPS->HTTP |
|---|---|---|---|
no-referrer | 不发送 | 不发送 | 不发送 |
origin | 仅 origin | 仅 origin | 仅 origin |
same-origin | 完整 URL | 不发送 | 不发送 |
strict-origin | 仅 origin | 仅 origin | 不发送 |
strict-origin-when-cross-origin | 完整 URL | 仅 origin | 不发送 |
no-referrer-when-downgrade | 完整 URL | 完整 URL | 不发送 |
unsafe-url | 完整 URL | 完整 URL | 完整 URL |
# 敏感页面禁止发送 Referer
# 登录页面、密码重置页面
@app.route('/reset-password')
def reset_password():
response = make_response(render_template('reset.html'))
response.headers['Referrer-Policy'] = 'no-referrer'
return responsePermissions-Policy
控制浏览器特性(如摄像头、麦克风、地理位置)的使用权限。
# 禁用不必要的浏览器特性
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()
# 允许同源使用摄像头
Permissions-Policy: camera=(self), microphone=(self)
# 允许特定源使用地理位置
Permissions-Policy: geolocation=(self "https://maps.example.com")// 旧版名称 Feature-Policy,已更名为 Permissions-Policy
// 常见可控制的特性
const features = [
'accelerometer', // 加速度计
'ambient-light-sensor',
'autoplay',
'camera', // 摄像头
'display-capture', // 屏幕捕获
'fullscreen',
'geolocation', // 地理位置
'gyroscope',
'magnetometer',
'microphone', // 麦克风
'midi',
'payment', // 支付请求
'picture-in-picture',
'usb',
];Content-Security-Policy (概要)
CSP 是最强大的安全头部,详见专门的 CSP 文章。核心配置:
Content-Security-Policy:
default-src 'none';
script-src 'self' 'nonce-{random}' 'strict-dynamic';
style-src 'self' 'nonce-{random}';
img-src 'self' data:;
font-src 'self';
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
upgrade-insecure-requests;X-XSS-Protection(已弃用)
# 旧版 XSS 过滤器(现代浏览器已移除)
# Chrome 78+ 已移除此功能
X-XSS-Protection: 0
# 推荐设为 0,避免旧浏览器中的绕过漏洞
# 使用 CSP 替代Cross-Origin 安全头
# Cross-Origin-Opener-Policy (COOP)
# 隔离窗口引用,防止 Spectre 等侧信道攻击
Cross-Origin-Opener-Policy: same-origin
# Cross-Origin-Embedder-Policy (COEP)
# 要求所有子资源明确允许跨域加载
Cross-Origin-Embedder-Policy: require-corp
# Cross-Origin-Resource-Policy (CORP)
# 控制资源可以被哪些源加载
Cross-Origin-Resource-Policy: same-origin
# same-origin: 仅同源
# same-site: 仅同站
# cross-origin: 允许跨域完整推荐配置
Nginx
server {
listen 443 ssl http2;
server_name example.com;
# 传输安全
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 内容安全
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-$request_id'; style-src 'self'; img-src 'self' data:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" always;
# 框架安全
add_header X-Frame-Options "DENY" always;
# 隐私控制
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
# Cross-Origin 隔离
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
# 禁用旧版 XSS 过滤器
add_header X-XSS-Protection "0" always;
# 隐藏服务器信息
server_tokens off;
more_clear_headers Server;
}Express.js (使用 Helmet)
const helmet = require('helmet');
app.use(helmet({
// HSTS
hsts: {
maxAge: 31536000,
includeSubDomains: true,
preload: true,
},
// CSP
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"],
styleSrc: ["'self'"],
imgSrc: ["'self'", "data:"],
frameAncestors: ["'none'"],
},
},
// 其他
frameguard: { action: 'deny' },
noSniff: true,
referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
permissionsPolicy: {
features: {
camera: [],
microphone: [],
geolocation: [],
},
},
crossOriginOpenerPolicy: { policy: 'same-origin' },
xssFilter: false, // 禁用旧版 XSS 过滤器
}));安全评分测试
# 在线测试工具
# https://securityheaders.com — 检测安全头配置评分
# https://observatory.mozilla.org — Mozilla 安全扫描
# 命令行检测
curl -sI https://example.com | grep -iE \
'strict-transport|content-security|x-frame|x-content-type|referrer-policy|permissions-policy'
# 使用 Nmap 检测
nmap --script http-security-headers -p 443 example.com安全头配置检查清单
最佳实践
- HSTS 是最基础的安全头,必须配置,
max-age至少一年 - X-Content-Type-Options: nosniff 必须配置,防止 MIME 嗅探
- 使用 CSP 的 frame-ancestors 替代 X-Frame-Options,但保留后者兼容旧浏览器
- Referrer-Policy 设为 strict-origin-when-cross-origin,平衡安全与功能
- 禁用不需要的浏览器特性,通过 Permissions-Policy 最小化攻击面
- 隐藏服务器版本信息(Server 头、X-Powered-By 头)
- 使用 securityheaders.com 定期检测,目标 A+ 评分
- 注销时使用 Clear-Site-Data:
Clear-Site-Data: "cache", "cookies", "storage"
贡献者
更新日志
2026/3/14 13:09
查看所有更新日志
9f6c2-feat: organize wiki content and refresh site setup于