考虑一个带有自由文本条目的另存为对话框,在该对话框中,用户以自由文本形式输入文件名,然后单击“保存”按钮。然后,软件将验证文件名,如果文件名有效,则将其保存。
在Unix文件系统上,应在验证中应用哪些规则,例如:
- 该名称以后在转义特殊字符等方面将不难操作。
- 规则不是太严格,以至于保存文件变得对用户不友好。
因此,基本上,应该从Unix文件名中限制的最小字符集是什么?
Answers:
的最小是斜线( '/')和NULL( '\ 0')
尽管公认的答案可能有道理,但我认为对脚本或其他内容进行一些限制可能会带来好处:
(-也许是空格,尽管我不愿意添加。)
如您所见,按照@Gavin的建议,您最好将其列入白名单...
不要忘记,您可以.
在开头添加一个点()以隐藏文件和文件夹...否则,我将遵循* NIX名称约定(来自Wikipedia):
大多数UNIX文件系统
/
,null
。正如Bombe在回答中指出的那样,限制用户输入至少不会令人烦恼,这是令人沮丧的。但是,作为开发人员,我们应该假定与我们的代码的每次交互都是恶意的,并将其视为恶意代码。
为了解决实际应用中的两个问题,而不是将某些字符列入白名单或黑名单,我们不应该简单地将用户输入用作文件名。
取而代之的是,使用[a-f0-9]
我们自己设计的安全名称(仅十六进制字符,以确保最终安全),该名称是通过用户输入(例如PHP的bin2hex)编码的,或者是随机生成的ID(例如PHP的uniqid),然后通过某种方法进行映射(例如您的选择)。
编码/解码可以在不依赖映射的情况下即时完成,因此实际上是理想的。用户永远不需要知道文件的真正名称。只要他们能够获取/设置文件,并且文件似乎像他们想要的那样,每个人都是赢家。
通过这种方法,用户可以调用它们的文件为所欲为,黑客将是唯一的人感到沮丧,你的文件系统会爱你:-)
name
而不是试图强制执行first
和last
单独(这使我非常生气)。或者,当我遇到任何的比其他密码限制最小长度。(“不允许有空格吗?!?出于什么尘世原因!?”)显然,在某些情况下,这比其他情况更合适。有时,出于完全有效的原因,您必须让用户指定实际的文件名。
让用户输入他想要的任何名称。人为地限制字符范围只会使用户烦恼,并且没有真正的目的。
The name will not be difficult to manipulate later in terms of escaping special characters, etc.
。人们在这里指出,有效文件名中可以包含许多字符,但实际上会引起很多问题。