2010-08-20 138 views
5

我正在创建文件上传脚本,我正在寻找验证上传文件的最佳技术和实践。PHP上传文件验证

允许的扩展名是:

$allowed_extensions = array('gif','jpg','png','swf','doc','docx','pdf','zip','rar','rtf','psd'); 

下面是我在做什么的清单。

  1. 检查文件扩展名

    $path_info = pathinfo($filename); 
    if(!in_array($path_info['extension'], $allowed_extensions)) { 
        die('File #'.$i.': Incorrent file extension.'); 
    } 
    
  2. 检查文件mime类型

    $allowed_mimes = array('image/jpeg','image/png','image/gif','text/richtext','multipart/x-zip','application/x-shockwave-flash','application/msword','application/pdf','application/x-rar-compressed','image/vnd.adobe.photoshop'); 
    if(!in_array(finfo_file($finfo, $file), $allowed_mimes)) { 
        die('File #'.$i.': Incorrent mime type.'); 
    } 
    
  3. 检查文件的大小。

我该怎么做才能确保上传的文件是有效的文件?我注意到奇怪的事情。我将.jpg文件扩展名更改为.zip,并将其上传。我认为它会有不正确的MIME类型,但之后我注意到我没有检查特定的类型,但是如果数组中存在特定的MIME类型。我会在稍后修复它,这对我来说没有任何问题(当然,如果你有任何好的解决方案/想法,请不要犹豫分享它)。我知道如何处理图像(尝试调整大小,旋转,裁剪等),但不知道如何验证其他扩展。

现在是我的问题了。

  1. 你知道验证这些文件的好技巧吗?也许我应该解压缩.zip/.rar文件的档案,但文档(doc,pdf)怎么样?
  2. 将旋转,调整.psd文件的大小?
  3. 基本上我认为.PSD文件有以下MIME类型:应用程序/八位字节流,但是当

我试着上传文件.PSD这表明我(图片/ vnd.adobe.photoshop)。我对此有点困惑。文件是否总是具有相同的MIME类型?

此外,我不能强制代码块工作。有人猜测为什么?

回答

3

大量的文件格式有一个漂亮的一套标准开始字节来表示的格式。如果您对前几个字节进行二进制读取,并根据已知格式的起始字节对其进行测试,则它应该是确保文件类型与扩展名匹配的相当可靠的方式。

例如,JPEG的起始字节是0xFF,0xD8;所以像这样:

$fp = fopen("filename.jpg", "rb"); 
$startbytes = fread($fp, 8); 
$chunked = str_split($startbytes,1); 
if ($chunked[0] == 0xFF && $chunked[1] == 0xD8){ 
    $exts[] = "jpg"; 
    $exts[] = "jpeg"; 
} 

然后检查对外。

可以工作。

+0

所以,纠正我,如果我错了,如果JPEG的起始字节不同于'0xFF,0xD8;'这意味着文件是无效的权利?有没有“起始字节”的列表?或...我如何创建它? – Tom 2010-08-20 22:27:58

+2

这里有一个体面的列表:http://www.mikekunz.com/image_file_header.html虽然它缺少PNG,但是它的头部与我所看到的非常一致。 – 2010-08-20 23:52:40

+0

@Collin艾伦:非常感谢!现在我知道要搜索什么。 – Tom 2010-08-21 01:56:45

4

如果您想验证图像,好事做的是利用和getimagesize(),看看如果返回大小的一组有效的 - 或错误出如果一个无效的图像文件。或者对于您尝试支持的任何文件使用类似的功能。

的关键是,文件名是指绝对没有。文件扩展名(.jpg等),MIME类型......都是针对人类的。

保证保证文件是正确类型的唯一方法是打开它并逐字节地评估它。也就是说,如果你想尝试验证大量的文件类型,显然这是一项相当艰巨的任务。在最简单的层面上,您可以查看文件的前几个字节,以确保它们与该类型文件的预期匹配。

+0

您是否知道分析第一个字节的手册或文档? – Tom 2010-08-20 22:26:49