为什么需要安全响应头
HTTP 安全响应头告诉浏览器如何安全地处理网站内容。配置得当可以防御多种常见攻击。
Nginx 完整安全头配置
# /etc/nginx/nginx.conf 或站点配置的 server 块
# === 核心安全头 ===
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
# 防止 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff" always;
# 启用 XSS 过滤(已废弃但向下兼容)
add_header X-XSS-Protection "0" always;
# 控制引荐来源信息
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 权限控制(限制 API 访问)
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), interest-cohort=()" always;
# === HSTS(HTTP Strict Transport Security)===
# 确认 HTTPS 正常工作后再启用
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# === CSP(Content Security Policy)===
# 根据实际需求调整,过于严格可能影响功能
add_header Content-Security-Policy "
default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval' https:;
style-src 'self' 'unsafe-inline' https:;
img-src 'self' data: https:;
font-src 'self' data: https:;
connect-src 'self' https:;
frame-ancestors 'self';
form-action 'self';
base-uri 'self';
" always;
Apache 配置
# .htaccess 或 httpd.conf
# 核心安全头
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
各安全头说明
| 响应头 | 作用 | 推荐值 | 风险 |
|---|---|---|---|
X-Frame-Options |
防止点击劫持(页面被嵌入 iframe) | SAMEORIGIN |
低 |
X-Content-Type-Options |
防止 MIME 嗅探攻击 | nosniff |
低 |
Strict-Transport-Security |
强制 HTTPS 连接 | max-age=63072000; includeSubDomains |
中 |
Referrer-Policy |
控制 HTTP Referer 头信息 | strict-origin-when-cross-origin |
低 |
Permissions-Policy |
控制浏览器 API 权限 | 按需限制 | 低 |
Content-Security-Policy |
防止 XSS 和数据注入 | 按站点配置 | 高 |
CSP 配置指南
宽松策略(适合大多数网站)
add_header Content-Security-Policy "
default-src 'self';
script-src 'self' 'unsafe-inline' https:;
style-src 'self' 'unsafe-inline' https:;
img-src 'self' data: https:;
font-src 'self' data: https:;
connect-src 'self' https:;
frame-ancestors 'self';
form-action 'self';
" always;
严格策略(适合安全敏感站点)
add_header Content-Security-Policy "
default-src 'none';
script-src 'self';
style-src 'self';
img-src 'self';
connect-src 'self';
frame-ancestors 'none';
form-action 'self';
base-uri 'self';
" always;
验证工具
- securityheaders.com — 安全头评级
- CSP Evaluator — CSP 策略评估
- SSL Labs — SSL/TLS 配置评级
curl -sI https://example.com | grep -i "^\(x-\|strict\|content\|referrer\|permissions\)"— 本地检查
配置检查清单
- X-Frame-Options: SAMEORIGIN
- X-Content-Type-Options: nosniff
- Strict-Transport-Security 已配置
- Referrer-Policy 已配置
- Permissions-Policy 已配置
- Content-Security-Policy 已配置并测试
- securityheaders.com 评级 A 或 A+
- 配置后测试网站功能正常