考虑带有自由文本条目的" 另存为"对话框,其中用户输入文件名作为自由文本,然后单击" 保存"按钮.然后,软件验证文件名,如果名称有效,则保存文件.
在Unix文件系统上,应在验证中应用哪些规则,以便:
在转义特殊字符等方面,该名称将难以操纵.
规则不是那么严格,以至于保存文件变得非用户友好.
基本上,应该从Unix文件名限制的最小字符集是什么?
的最小是斜线( '/')和NULL( '\ 0')
首先,你所描述的是黑名单.您更好的选择是将您的角色列入白名单,因为更容易(从用户的角度来看)插入字符而不是删除.
就unix环境中的好处而言:
AZ
AZ
0-9
下划线(_)
破折号( - )
期间(.)
应该涵盖你的基础知识.空间可以,但让事情变得困难.Windows用户喜欢它们,unix/linux不喜欢它们.因此,根据您的目标受众选择相应的.
经常被遗忘:冒号(:)不是一个好主意,因为它常用于$ PATH之类的东西,即"自动"找到可执行文件的目录列表.这可能会导致与DOS/Windows目录名混淆,当然冒号在驱动器名称中使用.
虽然接受的答案可能有道理,但我认为有一些限制可能会对脚本或其他东西造成伤害:
正斜杠(/)
反斜杠(\)
NULL(\ 0)
打勾(`)
以破折号( - )开头
明星(*)
管道(|)
分号(;)
报价("或")
冒号(:)
( - 也许空间虽然我不愿意添加它.)
正如你可以看到的那样,你可能会更好地将白名单改为@Gavin建议......
不要忘记你可以.
在开头添加一个点()来隐藏文件和文件夹......否则,我会遵循*NIX名称约定(来自维基百科):
大多数UNIX文件系统
案件处理:案例敏感案件保存
允许的字符集:任何.
保留字符:/
,null
.
最大长度:255.
备注:领先.表示ls和文件管理器默认不显示该文件
链接到维基百科关于文件名的文章
正如Bombe在他们的回答中指出的那样,限制用户输入至少令人沮丧,如果不是彻头彻尾的讨厌.但是,作为开发人员,我们应该假设与代码的每次交互都是恶意的,并将其视为恶意.
要在实际应用中解决这两个问题,而不是将某些字符列入白色或黑色,我们不应该使用用户输入作为文件名.
相反,使用[a-f0-9]
我们自己设计的安全名称(十六进制字符仅用于最终安全),或者从用户输入(例如PHP的bin2hex)编码,或者随机生成的ID(例如PHP的uniqid),然后通过某种方法进行映射(取你的选择)到用户输入.
编码/解码可以在不依赖于映射的情况下即时完成,因此实际上是理想的.用户永远不需要知道文件的真正用途; 只要他们能够获取/设置文件,它似乎被称为他们想要的东西,每个人都是胜利者.
通过这种方法,用户可以随心所欲地调用他们的文件,黑客将成为唯一受挫的人,并且您的文件系统会爱你:-)