什么字符应该从Unix文件名限制?
考虑使用自由文本input的另存为对话框,其中用户以自由文本formsinput文件名,然后单击保存button。 软件然后validation文件名称,如果名称有效,则保存该文件。
在Unix文件系统上,应该在validation中应用哪些规则:
- 稍后在转义特殊字符等方面操作这个名字并不难。
- 规则不是那么严格,保存文件变得不友好。
那么基本上,Unix文件名应该限制的最小字符数是多less?
最小值是斜线('/')和NULL('\ 0')
首先,你所描述的是黑名单 。 你最好的select是白名单你的angular色,因为(从用户的angular度来看)更容易插入字符,而不是带走。
就unix环境而言,什么是好的:
应该涵盖你的基本知识。 空间可以没关系,但是让事情变得困难。 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色的范围只会使用户烦恼,不能达到真正的目的。