6

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

允许的扩展名是:

$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: application/octet-stream 但是当

我尝试上传它显示给我的 .psd 文件 (image/vnd.adobe.photoshop)。我对此有点困惑。文件是否总是具有相同的 MIME 类型?

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

4

2 回答 2

5

许多文件格式都有一组非常标准的起始字节来指示格式。如果您对前几个字节进行二进制读取并针对已知格式的起始字节进行测试,那么它应该是确认文件类型与扩展名匹配的一种相当可靠的方法。

例如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";
}

然后检查分机。

可以工作。

于 2010-08-20T22:24:22.417 回答
4

如果要验证图像,最好使用 getimagesize(),并查看它是否返回一组有效的尺寸 - 如果它是无效的图像文件,则会出错。或者对您尝试支持的任何文件使用类似的功能。

关键是文件名没有任何意义。文件扩展名(.jpg 等)、mime 类型……是针对人类的。

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

于 2010-08-20T22:19:07.110 回答