Doconut Viewer 成为您应用程序安全边界的一部分,只要它显示合同、发票、工程图纸或客户记录。Doconut 提供查看层;周边的应用仍需决定谁可以打开文件、源文件存放在哪里、派生数据可以保留多长时间以及为调查记录了哪些信息。

Doconut 的文章安全文档查看实践 将服务器端渲染描述为防御深度设计中的一层。因此本文重点关注围绕 Doconut 的应用职责,并将实现细节指向维护的产品文档。
从威胁模型开始
“Private”和“secure”并不是配置项。在选择控制措施之前,先定义需要防止或检测的事件。
| 风险 | 示例 | 应用控制 |
|---|---|---|
| 未授权访问 | 用户在 URL 中更改文档标识符 | 对每个请求进行对象级授权 |
| 租户交叉访问 | 有效用户请求另一个客户的文件 | 在授权决策中包含租户范围 |
| 源泄露 | 直接返回存储路径或原始文件 | 服务器控制的查找和渲染流程 |
| 过期访问 | 角色或案件变更后链接仍可使用 | 短会话生命周期加授权重新验证 |
| 过度保留 | 临时输入或输出累积 | 明确的生命周期作业并可观察其结果 |
| 敏感日志记录 | 令牌或文件位置出现在日志中 | 结构化脱敏,仅记录标识符的遥测 |
根据系统中的文档和用户对风险进行优先级排序。公共宣传册库和法律证据门户不应仅因使用相同的查看器而共享同一策略。
Doconut 的法律文档审查用例是产品在已认证的案件、合同、证据和合规工作流中角色的有用参考。它也强化了架构边界:权限、存储、客户记录和业务规则应紧靠宿主应用。
在打开文档前进行授权
在使用 Doconut 打开文档之前,先完成身份验证和对象级授权。官方的.NET 6 或更高版本设置指南展示了查看器的配置以及服务器端文档的打开方式;请在该产品步骤之前放置您应用的身份、租户以及文档权限检查。
对应用公开的每个相关操作(包括页面、缩略图、搜索、注释、转换、下载和打印)重复相同的授权规则。隐藏按钮并不能保护底层请求。
避免直接接受来自浏览器的文件系统路径、存储键或远程 URL。先在服务器上将应用拥有的文档 ID 解析为存储位置,然后确认解析得到的对象属于已授权的租户和工作流。
将查看器与存储策略分离
查看器不应决定您的保留期限。请记录每种存储类别及其所有者:
- 源文档 — 受您主要内容或记录政策控制。
- 临时工作文件 — 为处理而创建,并通过计划的、可观察的生命周期删除。
- 渲染页面或缓存 — 限定在最小有用的生命周期内,并像源文件一样受保护。
- 导出和可打印文件 — 仅在用户拥有相应权限时创建。
- 日志和审计事件 — 包含标识符和结果,而非文档内容或凭证。
传输和静止时的加密取决于您的 Web 服务器、存储提供商、密钥管理和部署设置。请在实际环境中验证这些控制,而不是仅凭查看器库的存在推断。
谨慎使用短期引用
短期引用可以减少重放的时间窗口,但它不能取代授权。如果您的设计使用签名路由或会话令牌:
- 将其绑定到单个文档和预期操作。
- 根据工作流赋予其短暂的生命周期。
- 避免以明文形式放置敏感声明或存储位置。
- 对特权操作重新验证授权。
- 在自然到期前定义撤销的含义。
- 将令牌排除在分析、引用来源、异常信息和截图之外。
当浏览器会话过期时,显示中性提示并提供安全的重新认证方式。不要泄露另一个租户是否拥有该文档。
了解客户端控制的能力与局限
移除下载或打印控制可以改善预期工作流,但并不能保证机密性。能够看到内容的用户仍可能截屏、拍照或使用浏览器在查看器之外的功能。
将客户端限制视为可用性和威慑措施。更强的控制来自于将源文件保留在服务器后端、对每个相关请求进行授权、限制导出,并在政策要求时使用可见水印。
不要将产品功能当作合规声明
合规性取决于用途、数据类别、合法依据、合同、地区处理、保留、事件响应和组织流程。查看器可以支持合规设计,但本身并不能使应用合规。
进行 GDPR 评估时,至少记录:
- 源文件和派生文件的处理与存储位置
- 谁是每项服务的控制者和处理者
- 涉及哪些子处理器和传输
- 删除请求如何覆盖每个存储类别和备份策略
- 记录哪些事件以及日志保留多长时间
- 如何进行访问审查和事件响应
让隐私和法律利益相关者验证这些部署决策。
添加安全头部和缓存规则
对于已认证的预览路由,评估限制性的内容安全策略(Content Security Policy)、框架策略、MIME 嗅探防护以及引用策略。如果预览出现在 iframe 中,请明确指定预期的父来源。
根据敏感性和渲染路径选择缓存头。no-store 可能适用于某些响应,但会影响性能且不会抹除已在其他位置捕获的内容。请测试浏览器、代理和 CDN 的行为,而不是仅依赖单一头部。
记录决策,而非机密信息
有用的审计事件可能包含:
- 用户和租户标识符
- 文档标识符
- 请求的操作
- 授权结果
- 时间戳和关联 ID
- 保留或清理结果
避免记录原始令牌、查询字符串、存储 URL、包含个人数据的文档名称或提取的文本。保护审计日志不被篡改,并限制仅让需要的团队访问。
验证完整流程
安全测试应包括负面案例:
- 在保持认证状态下更改文档 ID。
- 重复使用来自其他用户或租户的预览 URL。
- 直接调用页面、缩略图、打印和导出端点。
- 在长时间预览期间使会话过期。
- 在文档打开期间撤销用户权限。
- 提交不受支持、超大、损坏或受密码保护的输入。
- 确认清理作业删除符合条件的数据并报告失败。
- 检查日志、分析和错误页面中的敏感值。
对稳定案例实现自动化,对存储配置、浏览器策略和查看器版本变更保留手动审查。
结论
注重安全的集成拥有明确的所有权。Doconut 提供文档查看能力,详见其官方文档;您的应用负责身份验证、授权、存储控制、保留、监控以及事件响应。将这些职责明确化,可产生更强的控制并使隐私声明更为真实。