5.4. 文件名

在某些情况下,文件名可能会导致严重问题。对于在具有本地不受信任用户的计算机上运行的安全程序来说,这尤其是一个问题,但这不仅限于这种情况。远程用户可能能够诱骗程序创建不良的文件名(程序应该阻止这种情况,但并非所有程序都这样做),或者远程用户可能已经部分渗透到系统,并尝试使用此技巧来渗透系统的其余部分。

通常,您不希望将 ``..''(上级目录)作为来自不受信任用户的合法值包含在内,但这取决于具体情况。您可能还希望仅列出您允许的字符,并禁止任何与列表不匹配的文件名。如果您要从外部用户获取数据并将其转换为文件名,则最好禁止任何目录更改,例如,通过不将 ``/'' 包含在合法字符集中。

通常,您不应该支持“globbing”,即使用 ``*``、``?``、``[''(匹配 ``]'')以及可能的 ``{''(匹配 ``}'')扩展文件名。例如,命令 ``ls *.png`` 对 ``*.png`` 执行 glob 操作以列出所有 PNG 文件。例如,C fopen(3) 命令不执行 globbing,但命令 shell 默认执行 globbing,而在 C 中,您可以使用(例如)glob(3) 请求 globbing。如果您不需要 globbing,只需尽可能使用不执行 globbing 的调用(例如,fopen(3))和/或禁用它们(例如,转义 shell 中的 globbing 字符)。如果您想允许 globbing,请格外小心。Globbing 可能很有用,但复杂的 glob 可能需要大量的计算时间。例如,在某些 ftp 服务器上,执行其中一些请求很容易导致整个机器的拒绝服务
ftp> ls */../*/../*/../*/../*/../*/../*/../*/../*/../*/../*/../*/../*
尝试允许 globbing,但限制 globbing 模式,可能是徒劳的。相反,请确保任何此类程序都作为单独的进程运行,并使用进程限制来限制它们可以消耗的 CPU 和其他资源量。有关此方法的更多信息,请参阅第 7.4.8 节,有关如何设置这些限制的更多信息,请参阅第 3.6 节

类 Unix 系统通常禁止在文件名中包含 NIL 字符(因为这标记名称的结尾)和 '/' 字符(因为这是目录分隔符)。但是,它们通常允许其他任何字符,这是一个问题;很容易编写出会被巧妙创建的文件名破坏的程序。

尤其可能导致问题的文件名包括