创建一个安全的,转义的路径库/文件名,检查是否安全

时间:2011-04-21 15:51:47

标签: c++ windows linux boost filesystems

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

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

所以我的相关问题是:

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

  4. 附加说明

    对于#1我想只是将boost path :: filename()与原始对象进行比较,如果它们相同则我有一个文件。然而,这仍然允许“...”和“。”之类的东西。但如果#2

    有一个很好的解决方案,这可能会没问题

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

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

    通用文件对话框不能用于进行过滤,因为界面可能并不总是允许它们,在某些情况下,用户不会直接知道与文件的关系(不过高级用户会这样做)。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

便携式便携式?许多系统都有长度限制,有些 可能还是这样。在名称之间消除一个问题吗?一些 系统区分情况,而其他情况则不然。最后.xxx怎么样? 对于某些系统而言,它很重要,对于其他系统而言,它只是文本。

忽略长度,最安全的选择是采取相反的方法: 创建一组已知的安全字符,并转换所有内容 那个特定的角色。 ASCII字母数字,'_'似乎 非常安全,你可能(今天)'-',但我怀疑 列表更进一步。并取决于你正在做什么这些 名称,你可能想强迫他们到一个案例,上面或 低。