本文目录导读:

网站安全头(HTTP Security Headers)是服务器通过HTTP响应头向浏览器传递的安全指令,能有效防御XSS、点击劫持、MIME嗅探等常见攻击,加固安全头是提升网站安全性的低成本、高收益措施。
以下是详细的加固指南,包含关键头部、配置方法及最佳实践。
核心安全头及配置方法
你需要根据网站的实际需求,在服务器上配置以下关键头部,配置位置因服务器软件(Nginx、Apache、IIS)或应用框架而异。
Content-Security-Policy (CSP) - 最强大但最复杂
- 作用:防止XSS、数据注入攻击,它定义了允许加载资源(脚本、样式、图片等)的源。
- 配置示例(严格模式):
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; frame-ancestors 'none'; base-uri 'self'
- 解释:只允许加载同源资源。
frame-ancestors 'none'防止被用于点击劫持。
- 解释:只允许加载同源资源。
- 最佳实践:
- 不要使用
'unsafe-inline'(除非必须),它会削弱保护。 - 使用
nonce-或hash-来允许内联脚本。 - 逐步部署:先用
Content-Security-Policy-Report-Only模式观察效果,确认无误再切换到强制模式。 - 使用
report-uri或report-to收集违规报告。
- 不要使用
X-Content-Type-Options: nosniff
- 作用:防止浏览器对MIME类型进行嗅探,强制浏览器使用服务器声明的
Content-Type,避免将非JS文件错误解析为JS脚本。 - 配置:
X-Content-Type-Options: nosniff
Strict-Transport-Security (HSTS)
- 作用:强制浏览器只能通过HTTPS访问网站,防止SSL剥离攻击。
- 配置示例:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age:建议设为至少1年(31536000秒)。includeSubDomains:对子域名同样生效。preload:提交给浏览器预加载列表(强烈建议,但需确保所有子域名都支持HTTPS)。
- 注意:开启后,如果一段时间内无法提供HTTPS,用户将无法访问。
X-Frame-Options: DENY
- 作用:防止点击劫持攻击,禁止页面被嵌入到
<frame>、<iframe>或<object>中。 - 配置:
X-Frame-Options: DENY(完全禁止,最安全)X-Frame-Options: SAMEORIGIN(仅允许同源iframe,如用于第三方支付回调页面)
Referrer-Policy
- 作用:控制HTTP请求中
Referer头的信息量,防止泄露URL中的敏感信息(如Token)。 - 配置示例:
Referrer-Policy: strict-origin-when-cross-origin
这是目前推荐的平衡安全与功能的策略:同源请求发送完整URL,跨域请求只发送来源,HTTPS降级到HTTP时不发送。
Permissions-Policy (原 Feature-Policy)
- 作用:控制浏览器可以使用的API和功能(如摄像头、麦克风、地理位置、传感器等),限制第三方内容滥用。
- 配置示例(严格模式):
Permissions-Policy: camera=(), microphone=(), geolocation=(), interest-cohort=()
- 可以禁用不需要的功能,或只允许自域名使用
self。
- 可以禁用不需要的功能,或只允许自域名使用
Cache-Control
- 作用:控制浏览器和CDN的缓存行为,防止静态资源被意外缓存导致问题。
- 配置示例:
- 敏感页面(如用户信息、订单):
Cache-Control: no-store, no-cache, must-revalidate, private - 静态资源(如CSS、JS、图片):
Cache-Control: public, max-age=31536000, immutable
- 敏感页面(如用户信息、订单):
如何检查和验证
配置完成后,务必进行验证:
-
在线扫描工具:
- SecurityHeaders.com:全球最权威,会给出评级,这是首选。
- Mozilla Observatory:提供详细报告和评分。
- CSP Evaluator:专门检查CSP配置问题。
-
浏览器开发者工具:
- 打开
Network面板,点击任意请求,查看Response Headers列表,确认目标头部已生效。
- 打开
分场景推荐配置清单
信息展示类网站(博客、官网)
- 安全级别:高,可以接受较严格的头。
- 推荐配置:
add_header X-Content-Type-Options "nosniff" 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=()" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; frame-ancestors 'none'; form-action 'self'" always;
交互式Web应用(电商、管理系统)
- 安全级别:中高,需要平衡安全性与第三方库的兼容性。
- 推荐配置(示例,需根据实际使用的CDN、统计工具调整CSP):
add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; # 可能用到iframe add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 先不加preload # CSP需逐步测试,以下仅为示例 add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https://www.google-analytics.com; frame-ancestors 'self'; form-action 'self'; connect-src 'self' https://api.example.com" always;
服务器配置示例
Nginx
server {
listen 443 ssl;
# ... SSL配置 ...
# 配置安全头
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'none'" always;
# ...
}
Apache
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set Content-Security-Policy "default-src 'self'; frame-ancestors 'none'"
</IfModule>
常见误区与注意事项
- 不要一次性开启所有安全头:特别CSP和HSTS。
- CSP:先用
Content-Security-Policy-Report-Only,收集一周的违规报告,再切换到强制模式。 - HSTS:先只设短
max-age(如5分钟),确认HTTPS一切正常,再逐步加到1年。
- CSP:先用
- 务必检查第三方CDN:如果你使用CDN,CDN可能会覆盖或丢弃你的安全头,需要在CDN配置中确保安全头能透传或直接在CDN层添加。
- 考虑兼容性:虽然现代浏览器都支持,但极低版本浏览器(如IE6)可能忽略某些头,不过这点影响已可忽略。
- 前后端分离:如果前后端分离,安全头应配置在提供前端静态资源的Web服务器(Nginx/CDN)上,而不是后端API服务器(除非API也返回HTML)。
- 错误报告配置:CSP的
report-uri可以发往自己的后端服务进行分析,可考虑使用开源的csp-report-server或商业SaaS服务。
一个安全的起步配置
对于大多数新项目,可以毫不犹豫地设置以下3个简单且无副作用的头:
X-Content-Type-Options: nosniffX-Frame-Options: DENYReferrer-Policy: strict-origin-when-cross-origin
然后根据业务需求,再谨慎添加CSP和HSTS。定期(如每月)使用 securityheaders.com 扫描你的网站,并将评级维持在 A+,是最佳实践。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播