什么字符应该从Unix文件名限制?

考虑使用自由文本input的另存为对话框,其中用户以自由文本formsinput文件名,然后单击保存button。 软件然后validation文件名称,如果名称有效,则保存该文件。

在Unix文件系统上,应该在validation中应用哪些规则:

  • 稍后在转义特殊字符等方面操作这个名字并不难。
  • 规则不是那么严格,保存文件变得不友好。

那么基本上,Unix文件名应该限制的最小字符数是多less?

最小值是斜线('/')和NULL('\ 0')

首先,你所描述的是黑名单 。 你最好的select是白名单你的angular色,因为(从用户的angular度来看)更容易插入字符,而不是带走。

就unix环境而言,什么是好的:

  • AZ
  • AZ
  • 0-9
  • 下划线(_)
  • 破折号( – )
  • 期间(。)
  • 应该涵盖你的基本知识。 空间可以没关系,但是让事情变得困难。 Windows用户喜欢他们,unix / linux不。 所以根据你的目标受众select相应的。

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

    不要忘记,你可以在开头添加一个点( . )来隐藏文件和文件夹…否则,我会遵循* NIX名称约定(来自维基百科):

    大多数UNIX文件系统

    • 案例处理:区分大小写的案例保存
    • 允许的字符集:任何。
    • 保留字符: /null
    • 最大长度:255。
    • 备注:领先。 表示ls和文件pipe理器不会默认显示文件

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

    虽然接受的答案可能是有道理的,但我认为有一些限制可能会对脚本或其他内容产生影响:

    • 正斜杠(/)
    • 反斜杠(\)
    • NULL(\ 0)
    • 勾号(`)
    • 以短划线( – )开始
    • 星星(*)
    • pipe道(|)
    • 分号(;)
    • 报价(“或”)
    • 冒号(:)

    ( – 也许空间,虽然我不愿意补充说。)

    正如你可以看到,你可能只是更好的白名单@Gavinbuild议…

    编码FTW

    正如Bombe在他们的回答中所指出的那样,限制用户的input如果不是彻头彻尾的烦人,至less是令人沮丧的。 但是,作为开发者,我们应该假设每一次与我们的代码的交互都是恶意的,并且像对待它们一样。

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

    而是使用我们自己devise的安全名称(hex字符[a-f0-9]只是为了最终的安全),要么从用户input(例如PHP的bin2hex ) 编码 ,要么是随机生成的ID(例如PHP的uniqid )然后通过某种方法(select)映射到用户input。

    编码/解码可以在不依赖映射的情况下实时完成,所以实际上是理想的。 用户永远不需要知道该文件真正被称为什么; 只要他们能得到/设置文件,而且看起来被称为他们想要的,每个人都是赢家。

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

    让用户input他想要的名字。 人为地限制angular色的范围只会使用户烦恼,不能达到真正的目的。