FileUpload.filename 截断多字节字符 (只保留扩展名)
我只是试图将我的产品的 bottle.py 0.11 更新为 0.12; 并且发现 Request.files 中的对象已更改为新的 FileUpload 类,而不是 cgi.FieldStorage。它们不兼容,并且与 filename 有所不同: - cgi.FieldStorage 的 filename 返回客户端文件名 - FileUpload.filename 返回用于保存的 SAFE-FILE-NAME,其中剔除了非 ASCII 字符和路径分隔符。 这些更改在多字节文化中几乎不会造成问题。如果用户上传了带有非 ASCII 文件名的文件,我们将通过 FileUpload.filename 获取文件名的扩展名。 例如: あいうえお.txt v 删除非 ASCII 字符 .txt v 去除扩展名 txt 我们还可以使用 raw_filename 代替,但 1. 需要关注文件名的 raw 状态,以便简单地显示用户上传的文件名是没有意义的。 2. 非 ASCII 文件名的 filename 变得毫无意义,并且对名称唯一性不够安全。 对于问题 1: 重命名 raw_filename/filename 为 filename/safe_filename 是最好的解决方案,我认为。大多数非专家用户使用 save 方法。或者使用带有 safe_ 前缀的保存方法。因此,这些更改对安全性的影响将最小。 FYI,对于我的产品,文件是通过序列号进行管理的。文件名存储在数据库中,以便用户可以识别它们。因此,无需使文件名变得安全。 对于问题 2: 使用百分比或其他转义方法而不是剪切,是继续当前方式的次优解决方案。这也可能解决问题 1 的一部分,转义字符串足以使用 raw_filename。无论如何,剪切是一个坏主意,希望能够修复此问题。仅使用日语字符来命名文件对于日本的普通人来说非常中立。在汉语或其他非 ASCII 国家中可能也是如此。 谢谢 似乎与以下问题有关: https://GitHub.com/bottlepy/bottle/issues/582
内容来源: bottlepy/bottle