网站安全头如何加固

wen 开源项目 31

本文目录导读:

网站安全头如何加固

  1. 核心安全头及配置方法
  2. 如何检查和验证
  3. 分场景推荐配置清单
  4. 服务器配置示例
  5. 常见误区与注意事项
  6. 一个安全的起步配置

网站安全头(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-urireport-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

如何检查和验证

配置完成后,务必进行验证:

  1. 在线扫描工具

    • SecurityHeaders.com:全球最权威,会给出评级,这是首选。
    • Mozilla Observatory:提供详细报告和评分。
    • CSP Evaluator:专门检查CSP配置问题。
  2. 浏览器开发者工具

    • 打开 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>

常见误区与注意事项

  1. 不要一次性开启所有安全头:特别CSP和HSTS。
    • CSP:先用 Content-Security-Policy-Report-Only,收集一周的违规报告,再切换到强制模式。
    • HSTS:先只设短 max-age(如5分钟),确认HTTPS一切正常,再逐步加到1年。
  2. 务必检查第三方CDN:如果你使用CDN,CDN可能会覆盖或丢弃你的安全头,需要在CDN配置中确保安全头能透传或直接在CDN层添加。
  3. 考虑兼容性:虽然现代浏览器都支持,但极低版本浏览器(如IE6)可能忽略某些头,不过这点影响已可忽略。
  4. 前后端分离:如果前后端分离,安全头应配置在提供前端静态资源的Web服务器(Nginx/CDN)上,而不是后端API服务器(除非API也返回HTML)。
  5. 错误报告配置:CSP的 report-uri 可以发往自己的后端服务进行分析,可考虑使用开源的 csp-report-server 或商业SaaS服务。

一个安全的起步配置

对于大多数新项目,可以毫不犹豫地设置以下3个简单且无副作用的头:

  1. X-Content-Type-Options: nosniff
  2. X-Frame-Options: DENY
  3. Referrer-Policy: strict-origin-when-cross-origin

然后根据业务需求,再谨慎添加CSP和HSTS。定期(如每月)使用 securityheaders.com 扫描你的网站,并将评级维持在 A+,是最佳实践。

抱歉,评论功能暂时关闭!