我需要清理一些将在文件名中使用的数据。一些数据包含空格和符号字符。是否有一个函数可以转义或清理适合在文件名(或路径)中使用的数据?我在PHP手册的'文件系统功能'部分找不到一个。我应该为文件名避开/清理哪些字符?
因此,假设我必须编写自己的函数,哪些字符需要转义(或更改)?
我需要清理一些将在文件名中使用的数据。一些数据包含空格和符号字符。是否有一个函数可以转义或清理适合在文件名(或路径)中使用的数据?我在PHP手册的'文件系统功能'部分找不到一个。我应该为文件名避开/清理哪些字符?
因此,假设我必须编写自己的函数,哪些字符需要转义(或更改)?
如果您有机会将原始名称存储在数据库中,我只需使用随机散列(mt_rand()/ md5/sha1)创建一个文件即可。好处是你不需要依赖底层操作系统(字符/路径长度),用户输入的值或长度,而且很难猜测/伪造文件名。也许即使是base64编码也是一种选择。
对于Windows:
/ \ : * ? " < > |
Unix上,技术上不算什么,但在实践中,同一个列表与Windows将是明智的。
只要您准备在操作文件时在命令行上使用引号,空格或&符就没有任何问题。
(顺便说一句,我试图通过重命名Windows上的东西从错误消息的文件,包括一个冒号,并复制了该列表。)
当消毒字符串的文件名,我们筛选出以下0x20的所有字符,以及<,>,:,“,/,\,|,?和*
对于Windows,如果您不想要-any-副作用,请将”&“添加到列表中。这是在某些数据显示中显示“下一个字符是我的热键”的字符(在旧窗口中最常见,但仍然在这里和那里弹出)。因此,而不是“M & M”,您会看到“M _M“...后面的字符&符号(空格)是一个“热键”,因此强调。
删除[a-z0-9 _ \ - 。]之外的所有内容可能是一个好主意。没有必要这么严格,但有一个目录列表没有任何意外,这很舒服。如果你正在使用一些奇怪的字符集,那么你可能希望在去除违规字符之前将编码转换为平坦的ascii(或者最终删除所有内容) ...
至少这就是我做它:-)
而不是筛选出字符为什么不只是允许[a-z0-9- [email protected]#$%^()]
?这肯定比猜测每个可能导致问题的角色更容易。
您的用户不应该需要任何其他字符的文件,对吧?
function getSafeFilesystemFileName() {
return (
md5($id . '-' . $filename) .
'.' . pathinfo($filename, PATHINFO_EXTENSION)
);
}
其中:
$id
是从数据库$filename
记录ID是原始上传的文件名(也存储在记录)一个重要的事情:将原始扩展名追加到生成的文件中。如果您需要将文件提供给关注扩展名的工具,那么使用该扩展名将比使用扩展名创建临时文件要容易得多。
事实上,在安全性/可靠性等方面,白名单似乎总是最好的。 – 2011-02-20 00:50:53