安全与隐私白皮书(总览)第 9 章
第 9 章 Web 安全与客户端隔离
FileBolt 的零知识模型要求“解密环境可信”。本章定义关键页面(尤其是下载/解密页)的 Web 安全边界: 以 CSP 与安全响应头为核心,限制可执行代码来源、阻止注入、降低点击劫持与跨站风险,并在可行范围内加强跨域隔离。 本章也明确一项底线原则:下载/解密页不加载第三方脚本,以避免第三方执行环境接触地址栏、DOM、剪贴板或密钥材料。
9.0 本章摘要
- MUST:关键页面(尤其下载/解密页)设置严格 CSP,最小化可执行脚本来源。
- MUST:下载/解密页不加载第三方脚本(统计/广告/热力图/第三方错误采集等)。
- MUST:禁止关键页面被 iframe 嵌入,降低点击劫持与 UI 注入风险。
- SHOULD:启用一组安全响应头(HSTS、Referrer-Policy、nosniff、Permissions-Policy 等),并按路由差异化更严格策略。
- MAY:在兼容性允许时,对解密页启用 COOP/COEP/CORP 强化隔离。
9.1 CSP 策略与资源加载边界
CSP(Content Security Policy)用于将“页面可以执行什么代码、可以从哪里加载资源”显式化与最小化。 对下载/解密页而言,CSP 是防止 XSS 与供应链注入的关键控制面之一。
9.1.1 基线原则
- 默认拒绝:CSP 应以
default-src 'none'或等价强基线为起点,逐项放行。 - 脚本最小化:
script-srcMUST 限制为自有域名与必要的 nonce/hash;关键页 SHOULD 避免'unsafe-inline'。 - 连通性最小化:
connect-srcMUST 仅允许与文件传输相关的自有 API/存储端点。 - 禁止不必要能力:
object-src 'none'、base-uri 'none'、form-action等应按页面目的最小化。 - 防嵌入:
frame-ancestorsMUST 为'none'或最小允许集,配合点击劫持防护(见 9.3)。
9.1.2 参考 CSP(下载/解密页示意)
以下为示意模板,需按实际资源与路由调整:
Content-Security-Policy:
default-src 'none';
base-uri 'none';
object-src 'none';
frame-ancestors 'none';
form-action 'none';
img-src 'self' data:;
style-src 'self';
font-src 'self';
script-src 'self';
connect-src 'self';
worker-src 'self';
manifest-src 'self';
upgrade-insecure-requests;- 若必须放行内联样式/脚本:SHOULD 使用 nonce/hash 精确放行,并在构建期固定可审计的哈希集合。
- 对可疑 DOM 注入点:MAY 结合 Trusted Types(如适用)降低 DOM XSS 风险。
9.1.3 路由差异化策略
不同页面的安全边界不同。营销页可能需要图片/CDN 字体等资源;解密页则应更严格。 推荐以路由维度配置策略(Nuxt 4 / Nitro 可通过 routeRules 或中间件实现):
/transfer、/d/**等关键下载/解密页:最严格 CSP,零第三方脚本。- 登录/管理后台:同样严格 CSP,但可能需要支付/身份相关的必要资源;必须逐项评审放行。
- 营销/帮助页:可适度放行图片/字体等,但仍应避免不必要的第三方脚本。
9.2 下载/解密页不加载第三方脚本
下载/解密页会处理 URL fragment(可能包含 CEK)并在客户端解密输出明文,因此必须保持执行环境可控。 第三方脚本具有读取 DOM、地址栏、剪贴板、输入事件与网络请求内容的能力,会显著扩大攻击面。
- MUST:下载/解密页不加载任何第三方脚本(统计、广告、热力图、第三方错误采集 SDK、A/B 测试等)。
- MUST:下载/解密页仅加载站点自有脚本与自有资源。
- SHOULD:若需要统计与可观测性,优先使用服务端聚合统计或自建最小化方案,并仅在非解密页面启用。
- MAY:极少数场景必须引入第三方资源时,必须经过威胁建模与安全评审,并使用 SRI + CSP 精确约束; 但下载/解密页仍应保持零第三方脚本。
9.3 Frame / Clickjacking / UI 注入防护
点击劫持(Clickjacking)与 UI 注入会在用户不知情的情况下诱导点击敏感操作或泄露信息。 对下载/解密页与管理页,必须禁止被不可信站点 iframe 嵌入。
- MUST:通过 CSP 设置
frame-ancestors 'none'(或最小允许集)。 - SHOULD:兼容性考虑下可同时设置
X-Frame-Options: DENY(或 SAMEORIGIN)。 - SHOULD:关键操作按钮增加二次确认、节流与可撤销设计,降低误触风险(管理端尤甚)。
9.4 安全响应头与浏览器策略
除 CSP 外,一组安全响应头可作为防线叠加,减少浏览器默认行为带来的风险。 建议全站启用基础集合,并对关键页面使用更严格配置。
9.4.1 推荐响应头(示意)
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Permissions-Policy: geolocation=(), microphone=(), camera=()- HSTS:MUST 启用,防止降级到 HTTP。
- Referrer-Policy:下载/解密页 SHOULD 使用
no-referrer或同等级严格策略,减少 URL 外泄风险。 - nosniff:MUST 启用,降低 MIME 嗅探导致的脚本执行风险。
- Permissions-Policy:SHOULD 禁用不必要高权限 API,减少浏览器能力面。
9.4.2 可验证证据
- 安全响应头与最佳实践扫描可在公开入口查看: /status#security-headers, /status#http-observatory
- 第三方扫描只能验证“公开可见配置”,不能证明客户端解密实现或零知识边界的全部属性。
9.5 Cookie、CSRF 与下载链路最小状态
下载链路可设计为最小状态(尽量不依赖 cookie)。如果存在管理后台或需要 cookie 的功能,必须在具备副作用的接口上做 CSRF 防护。
- SHOULD:下载/解密页不依赖 cookie;必要时也应使用
Secure与合适的SameSite。 - MUST:对任何有副作用接口(删除、撤销、配置修改等)实施 CSRF 防护: CSRF token / SameSite 策略 / 双重提交,并在可行时校验 Origin/Referer。
- MUST:下载链路的短期访问 token 不应放入 cookie 以避免被跨站自动携带; 应使用显式 Authorization 或等价机制传递。
9.6 跨域隔离(COOP/COEP/CORP)与兼容性
在兼容性允许时,可对下载/解密页启用更强的跨域隔离策略以减少跨站干扰与某些侧信道风险: Cross-Origin-Opener-Policy(COOP)、Cross-Origin-Embedder-Policy(COEP)与 Cross-Origin-Resource-Policy(CORP)。 这些策略可能影响第三方资源与部分嵌入场景,应在严格“无第三方脚本”的前提下评估部署。
- MAY:关键解密页启用 COOP/COEP/CORP 以加强隔离。
- SHOULD:部署前评估对 Worker、字体、图片与下载行为的影响,并在状态页或文档中说明兼容性边界。
- MUST:即便启用隔离策略,也不得放松 CSP 与“无第三方脚本”的底线。
9.7 前端依赖与供应链约束
Web 安全不仅取决于运行时策略,也取决于构建期与依赖管理。 对下载/解密页这类关键执行面,必须控制依赖来源与更新节奏,避免供应链风险扩大到解密环境。
- SHOULD:锁定依赖版本并使用可重复构建(lockfile),变更时进行审计与回归测试。
- SHOULD:减少依赖数量,避免引入不必要的运行时代码与第三方 SDK。
- SHOULD:对静态资源启用完整性校验与缓存策略(在自有域名范围内进行)。
- MUST:下载/解密页保持“自有脚本唯一来源”,避免运行时拉取第三方脚本。
9.8 相关 Claim IDs(预留)
本章涉及 CSP、无第三方脚本、点击劫持防护、安全响应头与(可选)跨域隔离等声明。 对应 Claim IDs 将补充到 附录:Claim IDs 总表 中,并以总表为唯一权威入口。