安全
本服务如何构建,使隐私承诺成为架构的属性,而非一句空话。
威胁模型
本服务处理的源代码,按其定义,比我们存储的任何东西都更敏感。设计上的回应是:绝不持有它:
- 无上传路径。 没有任何接受文件内容的端点。解析在用户标签页内由 WebAssembly 完成。
- 不对用户输入做服务端渲染。 生成的文档在浏览器中构建,从不经过我们的基础设施。
- Content-Security-Policy 中无第三方源。 依赖被攻破也无法悄悄外传数据,因为无处可发。
- 转义渲染。 文件路径来自用户自己的磁盘,而仓库中可能存在名为
<img onerror=…>.md的文件。所有源自用户的字符串在到达 DOM 前都会被转义。
控制措施
- Content-Security-Policy:
default-src 'self'、object-src 'none'、base-uri 'self'、form-action 'none'、frame-ancestors 'none'。设置两次——HTTP 头与 meta 标签——以便在忽略_headers的主机上依然生效。 X-Content-Type-Options: nosniff、Referrer-Policy: strict-origin-when-cross-origin、Cross-Origin-Opener-Policy: same-origin,以及禁用摄像头、麦克风、地理位置、browsing-topics 与 interest-cohort 的Permissions-Policy。- Cloudflare 对每个请求强制 TLS。
- 边缘限流以 IP 地址与自治系统号的摘要(而非地址本身)为键。
- CI 依赖审计;运行时依赖两个(
web-tree-sitter、fflate),外加 vendored 分析器引入的zod。 - 构建验证测试:若部署的包引用不存在的资源,或 CSP meta 被剥离,则失败。
浏览器支持
只做特性检测,绝不嗅探 user-agent。嗅探会让你封掉一个你从未听过的浏览器。
| 浏览器 | 等级 | 备注 |
|---|---|---|
| Chrome / Edge / Opera | 完整 | 原生文件夹选择、保存到文件夹、分享。 |
| Chromium-based (Brave, Vivaldi, Arc) | 完整 | 同一引擎;广告拦截器可能隐藏支持链接。 |
| Firefox | 支持 | 文件输入选择;下载与复制导出。 |
| Safari 16.4+ | 支持 | 文件输入选择;下载、复制与分享。 |
| Samsung Internet / mobile Chrome | 支持 | 分享可将文件直接发送到 AI 应用。 |
| Anything without WebAssembly | 不支持 | 应用会在加载时明确提示,而不是空白地失败。 |
报告漏洞
发邮件至 [email protected]。我们力争在五个工作日内确认。
没有漏洞赏金,我们也无法提供报酬。若您愿意署名,我们将在更新日志中致谢;对不损害服务与用户的善意研究,我们不会追究法律责任。
请勿对其他用户的会话进行测试。由于服务完全在客户端,几乎所有内容都可在本地针对您自己的构建进行测试。