【问题标题】:Create a safe, escaped path base/file name, check if safe创建一个安全的转义路径基/文件名,检查是否安全
【发布时间】:2011-04-21 15:51:46
【问题描述】:

我想知道是否有一种通用的方法来生成可移植的文件系统安全文件名。也就是说,我有一个用户输入了字符串,并希望生成一个名称与他们选择的名称非常相似的文件。结果名称不得包含任何路径引用或其他特殊的文件系统特殊名称或标记。

目前我只是用其他字符或空字符串替换一堆已知的坏字符。例如,给定名称ABC / DEF* : A Company?,我将生成字符串ABC - DEF - A Company。我对替换字符的选择完全是任意的,因为我不知道通用转义符号。

所以我的相关问题是:

  1. 是否有一种方法(可能在 boost 文件系统中)可以告诉我名称是否严格指代没有路径的文件?
  2. 是否有一个函数可以告诉我名称是否“安全”可用作文件(这可能是对某些文件系统的 1 的额外检查)?
  3. 是否有函数可以将字符串转换为合理的安全名称?

补充说明

对于#1,我想将 boost path::filename() 与原始对象进行比较,如果它们相同,则我有一个文件。然而,这仍然允许像'..'和'.'这样的东西。但如果#2 有一个好的解决方案,那可能没问题

理论上我必须提供文件所在的目录,因为不同的文件系统可能有不同的要求。但是操作系统的全局解决方案也可以。

我已经有一个函数,它只是替换了一堆众所周知的不安全字符。

不能使用通用文件对话框来进行过滤,因为界面可能并不总是允许它们,并且在某些情况下用户不能直接意识到与文件的关系(但是高级用户会)。

【问题讨论】:

    标签: c++ windows linux boost filesystems


    【解决方案1】:

    根据POSIX fully portable filenames,唯一可移植的文件名是那些仅包含A–Za–z0–9._- 并且最长为14 个字符的文件名。

    也就是说,一种更实用的方法是假设现代文件系统可以处理更长的文件名,并简单地将所有未明确标记为“安全”的字符替换为_。有时,这些字符不是用_ 替换,而是用十六进制编码,例如在URL 中:sample%20file.txt。例如,KDE 应用程序使用它。

    至于实现,就像s/[^A-Za-z0-9.-]/_/一样简单。

    【讨论】:

    • POSIX 可移植名称的限制太大了。这些名称可能很长并且包含 unicode 字符——我知道我的大多数目标平台都会支持它。仅替换字符的问题在于不排除文件系统可能具有的任何 特殊 名称。
    • @edA-qa-mort-ora-y:允许“fs 允许的任何内容”的问题是 1) Unix 文件系统实际上允许 /\0 之外的所有内容,以及 2)当用户尝试将生成的文件复制到另一个文件系统时,他会收到烦人的错误消息,例如。到 U 盘上(这里有自己的经验 :()。所以你最好使用跨多个文件系统的安全方法来处理文件名。
    【解决方案2】:

    便携性如何?许多系统对长度有限制,有些 可能仍然这样做。名称之间的区别是一个问题吗?一些 系统区分大小写,而其他系统则不区分大小写。最后的.xxx 怎么样? 对于某些系统,它很重要,而对于其他系统,它只是文本。

    忽略长度,最安全的选择是采取相反的方法: 创建一组已知的安全字符,并将所有内容转换为 那是一个特定的角色。 ASCII 字母数字和'_' 似乎 相当安全,你可能(今天)对'-' 没问题,但我怀疑 清单走得更远。取决于你用这些做什么 名称,您可能希望将它们强制为单个大小写,大写或 更低。

    【讨论】:

    • 我希望“方法”是可移植的,而不是结果名称。也就是说,允许的名称集可能因操作系统而异,甚至因文件系统而异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2016-12-06
    • 1970-01-01
    • 2023-03-21
    • 2017-11-05
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多