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

Create a safe, escaped path base/file name, check if safe

本文关键字:安全 文件名 检查 是否 路径 转义 一个 创建      更新时间:2023-10-16

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

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

所以我的相关问题是:

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

额外笔记添加

对于#1,我想只是比较一个boost路径::filename()与原始对象,如果它们是相同的,那么我有一个文件。然而,这仍然允许诸如"……'和'。'但如果#2有一个好的解决方案,那就没问题了

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

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

普通文件对话框不能用于过滤,因为界面可能并不总是允许这样做,而且在某些情况下,用户并不直接意识到与文件的关系(高级用户会)。

根据POSIX完全可移植文件名,唯一可移植的文件名是那些只包含A–Za–z0–9._-且最长14个字符的文件名。

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

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

便携有多便携?许多系统对长度有限制,有些可能现在还会。区分名字是个问题吗?一些系统可以区分情况,而其他系统则不能。最后的.xxx呢?对于某些系统,它是重要的,对于其他系统,它只是文本。

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