Origin Private File System:句柄、Worker 与隐私边界
了解 OPFS 的来源隔离、文件句柄、Worker 访问、配额结果与隐私安全验证。
BotBrowser Team
Origin Private File System(OPFS)为网页来源提供浏览器管理的私有文件区域,用于保存应用数据。它不同于用户可见的下载目录,也受浏览器存储策略约束。句柄标识该区域内的条目,不是通用路径,也不会授权访问其他来源。BotBrowser 可以重复经授权的页面流程并记录可见结果,但不能绕过来源检查、授予配额,或保证所有设备上的文件持久性。
OPFS 隔离什么
navigator.storage.getDirectory() 返回该来源的私有根目录。其下创建的文件和目录关联到来源及浏览器 profile。https://a.example 页面无法解析由 https://b.example 创建的句柄,即使两个应用使用相同文件名也是如此。私有文件也不同于用户通过选择器选取的文件。MDN 的 OPFS 指南说明了这种存储模型及浏览器管理的生命周期。
句柄是在此边界内使用的能力对象。FileSystemFileHandle 标识文件条目,FileSystemDirectoryHandle 标识目录。句柄可存入 IndexedDB 以便稍后重新打开,但应用仍须处理条目缺失、记录更名或 profile 被清除。将句柄视为不透明应用状态,不要把它当作可展示或发送给服务器的路径。
边界针对来源,而非账户。同一来源的多个用户可能共用一个 profile,一个用户也可能有多个 profile。不要把句柄读取成功变成身份信号。句柄缺失可能表示首次使用、删除、浏览器清理、切换 profile 或应用迁移。
句柄与 Worker 访问
Worker 可以访问 OPFS 根目录,因此适合执行解析、索引等 UI 线程之外的工作。Worker 仍运行在相同来源和 profile 中,不会成为跨来源文件服务。在支持的上下文中,专用 Worker 可使用同步访问句柄;异步方法则是更通用的基线。应在实际上下文检测能力并准备回退。
明确句柄的消息协议。页面可以向 Worker 发送有限命令,Worker 返回状态或派生结果。能用小范围操作解决时,不要传递凭证、完整文件内容或不受约束的消息通道。验证消息来源和操作名称,并在任务结束时关闭 Worker。
并发写入需要应用规则。Worker 和 tab 可以同时持有句柄,浏览器不会决定哪个业务更新胜出。使用版本号、应用拥有的锁或事务格式。写入完整的新记录,按 API 要求刷新或关闭,然后发布新版本。Worker 被终止时可能留下不完整记录,因此恢复逻辑要区分“尚未开始”“已提交”和“中断后结果未知”。
配额与持久化结果
OPFS 会占用浏览器存储配额。navigator.storage.estimate() 返回估算值,不是容量承诺;其他 tab 或来源也可能改变可用空间。写入可能因配额、权限或策略限制,或实现相关错误而失败。界面应保留用户输入并说明下一步,不要声称文件已保存。
持久化是请求,不是保证。navigator.storage.persist()可能依浏览器策略、使用情况、设备条件和隐私浏览规则返回 true 或 false。true 仅描述当前来源和 profile,不承诺备份、导出或用户清除数据后的存续。记录保留选择;重要数据应提供明确导出方式。
配额观察用于容量规划,不用于指纹识别。记录 saved、quota-full 或 storage-unavailable 等粗粒度应用结果,避免保留精确设备容量或长期存储特征。测试完成后删除诊断 fixture;仅在产品目的需要时才将账户记录保存在服务器。
隐私安全验证
使用合成来源和干净测试 profile。创建小文件,在同一来源读取,再尝试从第二个来源执行相同操作。预期应是功能结果:第二个来源无法解析第一个来源的句柄。这不是个人身份、浏览器厂商或所有存储 API 的证据。
分别测试页面与 Worker 路径:在页面创建文件,在 Worker 读取,在写入期间终止 Worker,然后重新打开记录。记录浏览器族、版本、来源类别、profile 状态、操作结果和可见回退。不要上传真实文档或收集完整目录清单。浏览器更新后使用相同 fixture 对比,避免同时更换 profile、应用版本和存储策略。
File System Access API 规范与 WHATWG Storage Standard定义接口和存储概念,但不承诺业务结果。API 调用成功只能证明该操作在此上下文成功。服务器授权、加密、保留和恢复仍由应用负责。
产品边界与恢复
告知用户草稿是留在当前浏览器、导出到所选文件,还是上传到账户。在用户确认导出或上传前保留本地草稿。提供清除私有文件的明确操作,并确保 OPFS 不可用时页面仍可使用。第一方恢复页面可以恢复已授权的账户记录,但不能静默复制其他来源的私有文件。
句柄失效时,区分空工作区和网络请求失败。首次使用显示设置,临时失败提供重试,profile 被清除则提供恢复或导出操作。可访问状态文本应说明结果,不暴露私有文件名或账户标识。
BotBrowser 可以在声明的 profile 中重复经授权的 OPFS 流程,并比较支持的浏览器版本中的可见结果。它不能控制浏览器配额策略、持久化决定、来源隔离、Worker 调度或服务器保留策略。将运行结果视为特定测试流程的证据,并记录浏览器、profile、应用版本及回退路径。
来源与延伸阅读
- MDN:Origin private file system
- WICG:File System Access
- WHATWG:Storage Standard
- MDN:StorageManager.persist()
下一步可使用合成数据运行一个双来源、页面与 Worker 测试 fixture,并为配额不足或存储不可用设计明确回退。
TL;DR
- OPFS 文件属于一个来源和 profile;句柄不是共享路径或账户身份。
- Worker 可以访问同一来源的文件,但并行写入仍需要版本和恢复规则。
- 配额与持久化结果有条件,应保留输入并提供导出或回退。
Contents
Conclusion
OPFS 是来源范围内的工作区,不是跨站身份或备份系统。句柄应保持不透明,Worker 写入应可恢复,配额应视为观察结果。另见浏览器存储分区和 Web Locks 协调。