打印文件来自不受信任的用户手机。即使文件只是为了打印,也不能默认它是安全、完整或与扩展名一致的。文件处理应在中心平台完成严格预检,门店代理只接收已经批准的标准化文件。
一、第一期支持范围
建议正式第一期继续只支持:
- JPG / JPEG
- PNG
这三类已经在当前原型中实现基础校验。DOC、DOCX、PPT、PPTX、XLS 和 XLSX 暂不直接交给门店电脑打开。
二、完整处理管线
1. 上传前控制
- 扩展名白名单
- 用户、IP 和设备的上传频率限制
- 声明文件大小限制
- 单用户存储配额
- 目标打印机能力检查
2. 上传到私有对象存储
小程序使用短期签名直传,Bucket 不公开。对象键使用随机 ID,不使用原始文件名作为路径,避免路径冲突、中文编码和隐私泄漏。
3. 上传完成复核
服务端读取对象元数据和文件内容,检查:
- 实际大小与声明大小一致
- MIME 和扩展名匹配
- 文件魔数匹配
- SHA-256 计算完成
- 对象没有在校验期间发生变化
4. 格式解析
PDF 检查结构、真实页数、页面尺寸、加密状态和解析超时。图片检查宽高、总像素、解码内存和颜色模式。
不能仅根据 PDF 文件中的一个字符串估算页数;价格和页数必须来自受控解析器的实际结果。
5. 恶意内容扫描
- 使用恶意文件扫描引擎
- 限制压缩层级和展开后大小
- 限制 CPU、内存、磁盘和处理时间
- 禁止解析器访问外网
- 不执行脚本、宏或嵌入附件
- 失败对象进入隔离区,不进入报价
6. 规范化
图片可以转换为标准 PDF,固定页面尺寸、方向、缩放和背景。规范化文件生成新的 SHA-256,并记录它与源文件的派生关系。
7. 代理下载复验
门店代理核对:
- HTTP 返回码
Content-Length- 实际下载字节数
- 平台提供的 SHA-256
- 文件类型和任务参数摘要
校验失败时可以重新下载,因为还没有接触打印机。
8. 打印后清理
源文件和派生文件按 expires_at 自动删除。删除任务需要重试、积压监控和审计,不能只依赖一个可能失效的定时脚本。
三、为什么 Office 文档要单独处理
Office 文档的页数与字体、软件版本、打印驱动、纸张和区域设置有关,还可能包含宏、外链、嵌入对象和复杂公式。如果门店代理直接用本地 Office 打开:
- 页面数可能与报价不一致
- 缺少字体会改变排版
- 宏或外链增加安全风险
- Office 弹窗可能阻塞无人值守打印
- 不同门店得到不同结果
生产方案是在中心侧的隔离沙箱中:
- 禁止网络和宏。
- 限制进程权限、CPU、内存、磁盘和时间。
- 安装固定版本转换工具和受控字体集。
- 转换为 PDF。
- 再次解析页数并生成预览。
- 用户确认预览后重新报价和支付。
沙箱转换完成前,继续拒绝 Office 文件比“勉强能打印”更安全。
四、隐私保护
最小化收集
只收集完成打印、支付和售后所需的信息。文件名可能包含姓名、证件号或合同名称,因此普通日志只记录文件 ID、哈希前缀、大小、页数和格式。
访问控制
- 用户只能读取自己的订单和文件状态。
- 门店代理只能在有效租约内下载对应任务文件。
- 门店工作人员默认看不到文件正文。
- 客服或技术人员临时访问文件需要授权、理由、时限和审计。
- 对象存储管理员权限与应用访问身份分离。
传输和存储
- 全程 HTTPS
- 对象存储服务端加密
- 数据库敏感字段加密或哈希
- 短期签名 URL
- 生产、预发和开发数据隔离
保留时间
建议打印完成后 24 小时内删除文件,并根据真实售后需要尽可能缩短。支付和订单元数据可按财务、争议和法规要求单独保留,但不应因此无限期保存文件正文。
用户权利
小程序应明确说明处理目的、保存时间、第三方服务和删除方式,并提供主动删除入口。正式公开运营前,应完成微信小程序隐私保护指引、个人信息处理规则和必要备案,具体文本由专业法务复核。
五、文件安全检查清单
- Bucket 默认私有,无法匿名列出或下载
- 上传 URL 和下载 URL 均短期有效
- 文件扩展名、MIME 和魔数三者一致
- PDF 页数和图片尺寸由服务端解析
- 解析器有超时和资源上限
- 恶意文件扫描失败时默认拒绝
- 门店代理再次校验 SHA-256
- 日志和错误平台没有文件正文
- 自动删除任务有监控和告警
- 用户可以看到保留时间并主动删除
- Office 文件不会在门店代理直接执行