Unix 文件名应该限制哪些字符?

考虑一个带有自由文本条目的 除了 A对话框,用户输入一个文件名作为自由文本,然后单击一个 保存按钮。然后,软件验证文件名,并保存文件,如果名称是有效的。

就 Unix文件系统而言,应采用哪些规则进行验证,以便:

  • 以后在转义特殊字符等方面对名称进行操作并不困难。
  • 这些规则没有那么严格,以至于保存文件变得对用户不友好。

那么基本上,应该限制 Unix 文件名的 最低限度字符集是什么呢?

77862 次浏览

首先,你描述的是 黑名单。您的更好的选择是 白名单您的字符,因为它更容易(从用户的角度来看)有字符插入而不是删除。

就 Unix 环境中的优点而言:

  • A-Z
  • A-Z
  • 0-9
  • 下划线(_)
  • 破折号(-)
  • 期(.)

应该包括你的基本知识。空间可以很好,但是让事情变得困难。Windows 用户喜欢,但 unix/linux 不喜欢。因此,根据你的目标受众选择相应的。

最低限度是斜杠(’/’)和 NULL (’0’)

让用户输入他想要的任何名称。人为地限制字符的范围只会惹恼用户,没有任何实际意义。

不要忘记,您可以在开头添加一个点(.)来隐藏文件和文件夹... ... 否则,我将遵循 * NIX 名称约定(来自 Wikipedia) :

大多数 UNIX 文件系统

  • 案例处理: 区分大小写的案例保存
  • 允许的字符集: any。
  • 保留字符: /null
  • 最大长度: 255。
  • 注意: 一个引导。表示是 默认情况下,文件管理器不会 给我看文件

链接到维基百科关于文件名的文章

经常被遗忘的是: 冒号(:)并不是一个好主意,因为它通常用在 $PATH 之类的东西中,也就是“自动”找到可执行文件的目录列表。这可能会导致与 DOS/Windows 目录名混淆,当然这里的驱动器名称中使用冒号。

虽然公认的答案可能有道理,但我认为有一些限制是有好处的,这些限制可能会对脚本或其他东西造成潜在的麻烦:

  • 正斜杠(/)
  • 反斜杠()
  • 空(0)
  • 滴答(’)
  • 以破折号(-)开头
  • 星(*)
  • 管道
  • 分号(;)
  • 引文(”或’)
  • 冒号(:)

(也许是空格,虽然我不太愿意加上。)

正如你所看到的,如@Gavin 所建议的那样,你最好把自己列入白名单... ..。

编码 FTW

正如 炸弹在他们的回答中指出的那样,限制用户输入即使不是彻头彻尾的恼人,也至少是令人沮丧的。尽管如此,作为开发人员,我们应该假设与我们的代码的每一次交互都是恶意的,并且应该这样对待它们。

为了在实际应用程序中解决这两个问题,而不是白名单或黑名单中的某些字符,我们不应该使用用户输入作为文件名。

相反,使用我们自己设计的安全名(十六进制字符 [a-f0-9]只是为了最终的安全) ,或者从用户输入的 编码(例如 PHP 的 bin2hex) ,或者随机生成的 ID (例如 PHP 是独一无二的) ,然后通过某种方法(选择你的方法)映射到用户输入。

编码/解码可以在不依赖映射的情况下即时完成,因此非常理想。用户永远不需要知道文件的 真的调用; 只要他们能够获取/设置文件,并且它的 出现了调用他们想要的,每个人都是赢家。

通过这种方法,用户可以任意调用他们的文件,黑客将是唯一的 受挫,你的文件系统将爱你: -)