2009-06-26 62 views
9

我需要清理一些将在文件名中使用的数据。一些数据包含空格和符号字符。是否有一个函数可以转义或清理适合在文件名(或路径)中使用的数据?我在PHP手册的'文件系统功能'部分找不到一个。我应该为文件名避开/清理哪些字符?

因此,假设我必须编写自己的函数,哪些字符需要转义(或更改)?

回答

5

如果您有机会将原始名称存储在数据库中,我只需使用随机散列(mt_rand()/ md5/sha1)创建一个文件即可。好处是你不需要依赖底层操作系统(字符/路径长度),用户输入的值或长度,而且很难猜测/伪造文件名。也许即使是base64编码也是一种选择。

10

对于Windows:

/ \ : * ? " < > | 

Unix上,技术上不算什么,但在实践中,同一个列表与Windows将是明智的。

只要您准备在操作文件时在命令行上使用引号,空格或&符就没有任何问题。

(顺便说一句,我试图通过重命名Windows上的东西从错误消息的文件,包括一个冒号,并复制了该列表。)

2

当消毒字符串的文件名,我们筛选出以下0x20的所有字符,以及<,>,:,“,/,\,|,?和*

2

对于Windows,如果您不想要-any-副作用,请将”&“添加到列表中。这是在某些数据显示中显示“下一个字符是我的热键”的字符(在旧窗口中最常见,但仍然在这里和那里弹出)。因此,而不是“M & M”,您会看到“M _M“...后面的字符&符号(空格)是一个“热键”,因此强调。

3

删除[a-z0-9 _ \ - 。]之外的所有内容可能是一个好主意。没有必要这么严格,但有一个目录列表没有任何意外,这很舒服。如果你正在使用一些奇怪的字符集,那么你可能希望在去除违规字符之前将编码转换为平坦的ascii(或者最终删除所有内容) ...

至少这就是我做它:-)

4

而不是筛选出字符为什么不只是允许[a-z0-9- [email protected]#$%^()]?这肯定比猜测每个可能导致问题的角色更容易。

您的用户不应该需要任何其他字符的文件,对吧?

+1

事实上,在安全性/可靠性等方面,白名单似乎总是最好的。 – 2011-02-20 00:50:53

0

实施@merkuro answer

function getSafeFilesystemFileName() { 
    return (
     md5($id . '-' . $filename) . 
     '.' . pathinfo($filename, PATHINFO_EXTENSION) 
    ); 
} 

其中:

  • $id是从数据库
  • $filename记录ID是原始上传的文件名(也存储在记录)

一个重要的事情:将原始扩展名追加到生成的文件中。如果您需要将文件提供给关注扩展名的工具,那么使用该扩展名将比使用扩展名创建临时文件要容易得多。

相关问题