应用安全

文件名安全:路径穿越、Unicode 欺骗与下载响应头

把展示名与存储键分离,规范化 Unicode、剥离路径语义、限制长度,并正确生成 Content-Disposition,避免覆盖文件和界面欺骗。

工程上最危险的不是完全不可用,而是在理想环境里正常、进入真实网络和真实数据量后悄悄失去边界。 文件名是用户内容而不是路径。服务端使用随机对象键,展示名仅作元数据;不同操作系统对斜杠、保留名、尾点和 Unicode 规范化规则不同。

安全评审要从资产、攻击者能力和信任边界出发,并在每次状态转换重新授权。输入校验、速率限制和审计只能互补,任何一个都不能替代权限判断。

工程边界与取舍

这项能力横跨客户端、网络与服务端,局部最优很容易制造全局故障。工程决策需要同时约束两端行为、持久化事实和运维预算。

  • 取 basename 后移除控制字符与双向覆盖符,统一 NFC、限制 UTF-8 字节数并保留扩展名;下载同时提供安全 ASCII fallback 与 RFC 5987 filename*。
  • 先定义正常、降级、取消和失败四类终态,再让界面、存储与指标消费同一状态。
  • 兼容性通过显式能力协商决定,旧客户端得到可解释的降级路径,而不是进入半可用状态。

“文件名安全:路径穿越、Unicode 欺骗与下载响应头”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。

生产环境会怎样出错

生产问题往往发生在两个正确动作同时到达时。需要逐条检查迟到消息、重复执行、资源耗尽和版本交叉,而不是只补当前堆栈显示的那一行。

  • 直接拼接上传目录允许 ../ 覆盖配置;视觉相同但编码不同的名称可绕过重复检查,RTL 字符还能伪装可执行扩展名。
  • 只修正界面状态而没有清理底层资源,下一次操作继承队列、锁或过期凭据并再次失败。
  • 指标标签直接包含用户或任务标识,既制造高基数成本,也让诊断数据泄露不必要的身份信息。

把测试跑成闭环

发布闸门应包含确定性回归、随机时序探索和真实浏览器组合。发现一次失败后保存 seed 与状态轨迹,让它永久成为可重放用例。

  1. 覆盖 Windows 保留名、点路径、混合斜杠、NFD/NFC、超长 emoji、CRLF 和 RTL 文件名,确认存储隔离且下载头无法注入。
  2. 连续执行一百次开始、失败、重试和取消,检查句柄、监听器、队列及临时数据回到基线。
  3. 用故障注入验证告警先于用户投诉触发,并确认值班人员能从有限证据定位到具体阶段。

最终交付标准应当是:正常路径足够快,异常路径能够收敛,用户意图不会被自动恢复覆盖,运维人员也能从有限而安全的证据定位问题。

把方法变成一次真实连接

打开 uCopy,让两台设备在浏览器里安全连接并开始传输。

开始免费使用