繁体   English   中英

PHP上传文件验证

[英]PHP Upload File Validation

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

允许的扩展名为:

$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类型?

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

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

关键是文件名绝对没有意义 文件扩展名(.jpg等),mime类型......适用于人类。

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

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

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

然后检查exts。

可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM