【问题标题】:How to detect if the uploaded file is not an image? [duplicate]如何检测上传的文件是否不是图片? [复制]
【发布时间】:2017-05-20 01:00:08
【问题描述】:

如何检查上传的文件是否单独是图片而不是视频文件之类的?

我测试了一个简单的代码来检查上传的文件是否是图片。

表格

<form method="post" enctype="multipart/form-data">
    <input type="file" name="photo" accept="image/*">
    <input type="submit" name="submit" value="Test">
</form>

虽然我有accept="image/*",但我可以轻松将其更改为All types 并获得非图像文件。

检查文件是否为有效图像的代码(仅用于测试)

if($_POST['submit']) {
    $tmp_file = $_FILES['photo']['tmp_name'];
    if(mime_content_type($tmp_file)) {
        var_dump(mime_content_type($tmp_file));
    } else {
        echo 'error1';
    }
    if(getimagesize($tmp_file)) {
        var_dump(getimagesize($tmp_file));
    } else {
        echo 'error2';
    }
}

到目前为止,我对此进行了 3 次测试,2 次通过 1 次失败:

  1. 测试图像 = 通过。
  2. 测试一个非图像有效的 .srt 文件 = 已通过(给 getimagesize 一个错误)
  3. 测试有效视频文件.mp4 = 失败(提交后加载5-10秒,没有报错)

对此我需要做些什么?我不知道是什么问题,因为它没有给出来自var_dump()echo 'errors' 的任何结果。我现在确实认为 PHP 正在接受该文件。

注意

我需要这样做,以便只上传有效的图像。

注2

标记问题的已接受答案不适用于我。

更新

如果我尝试上传小于 128M 的视频,它会返回一些内容。但是,如果它大于 128M,它在我的 localhost 中什么也得不到,但我在生产站点中对此进行了测试,它给了我一个 REQUEST TIME OUT

【问题讨论】:

  • 图像文件的扩展名有限,如 .jpg、.jpeg、.png、.gif 等,您可以检查它们
  • 依赖用户提供的扩展是不安全的。

标签: php file-upload upload


【解决方案1】:

找到这样的文件扩展名并检查有效类型...

function  getextension($name){
    $count=substr_count($name,".");
    if($count>1){//some cases have two dotes
        $name= preg_replace('/\.(?=.*\.)/', '_', $name);
    }
    list($txt, $ext) = explode(".", $name);
    return $ext;
}

$name = $_FILES['imageupload']['name'];//Name of the File
$image_extension = getextension($name);

 $allowed_extension = array("jpg", "png", "gif", "bmp", "jpeg","JPG","PNG","GIF","BMP","JPEG");
 $image_extension=getextension($name);
  if (!in_array($image_extension, $allowed_extension)) {
    $error_flag = 1;
    $message = "Invalid File Format";
 }

【讨论】:

  • 我搜索并阅读了关于不信任用户提供的文件扩展名的信息。
【解决方案2】:

根据问题点,解析和检查扩展是不够的。

我建议在加载文件后检查文件EXIF(可交换图像信息)数据。

您可以在扩展的基础上进行基本验证,然后如果成功,则检查图像的exif数据。

为此,您将需要一个单独的 DLL 来加载,该 DLL 将具有与 exif 相关的功能。

http://php.net/manual/en/ref.exif.php

【讨论】:

  • 你的意思是我得到了用户给文件的扩展名?
  • 我不明白你的意思,我的意思是检查你的测试用例失败的 EXIF 细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2016-12-11
相关资源
最近更新 更多