【问题标题】:php image type detectionphp图像类型检测
【发布时间】:2011-05-20 11:09:05
【问题描述】:

无法检测 mime 类型。如果我删除($mime=="image/jpeg" || $mime=="image/pjpeg"),它可以成功上传图片。

$mime = $_FILES['Filedata']['type'];
if((!empty($_FILES['Filedata']['tmp_name'])) && ($_FILES['Filedata']['error'] == 0)) {
  $filename = basename($_FILES['Filedata']['name']);
  $ext = pathinfo($filename, PATHINFO_EXTENSION);
  if (($ext=="jpg" || $ext=="jpeg") && ($mime=="image/jpeg" || $mime=="image/pjpeg") && ($_FILES["Filedata"]["size"] < 350000)) {
        $newname = $filename;
        if (!file_exists($newname)) {
            if (move_uploaded_file($_FILES['Filedata']['tmp_name'], "./photo/" . $newname)) {
                echo "It's done! The file has been saved as: ".$newname;
            } else {
                echo "Error: A problem occurred during file upload!";
            }
        } else {echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";}
  } else {
     echo "Error: Only .jpg images under 350Kb are accepted for upload";
  }
} else {
    echo "Error: No file uploaded";
}

【问题讨论】:

  • 您不应该依赖从浏览器传递的类型。请改用getimagesize()

标签: php


【解决方案1】:

上传文件的nametype 信息应被视为纯粹的信息,并且切勿用于任何严重的事情,因为它是用户提供的信息,很容易被欺骗。您应该只查看tmp_nameerrorsize 字段来确定是否要接受文件。要查找文件的实际 MIME 类型,请使用 PHP 的内置函数:

if ($file['error'] == UPLOAD_ERR_NO_FILE) {
    die('No file uploaded');
}

if ($file['error'] != UPLOAD_ERR_OK) {
    die('Error during upload');
}

if (!$file['size'] || !is_uploaded_file($file['tmp_name'])) {
    die('File is weird');
}

$extensions = array(IMAGETYPE_GIF => '.gif', IMAGETYPE_JPEG => '.jpg', IMAGETYPE_PNG => '.png');
$exifType = exif_imagetype($file['tmp_name']);
if (!isset($extensions[$exifType])) {
    die('Unsupported file type');
}

$ext = $extensions[$exifType];
$targetDir = '/somewhere/else/';

do {
    $target = $targetDir . uniqid() . $ext;
} while (file_exists($target));

if (!move_uploaded_file($file['tmp_name'], $target)) {
    die('Something went wrong');
}

echo 'Yay, uploaded!';

虽然您不一定要使用那么多 die() 语句,但这只是为了演示目的。

【讨论】:

  • exif 包含图像中的标题信息?如果用户剥离 Photoshop 插入的信息会怎样?
  • @Macris exif 查看每个有效图像必须具有的文件开头的某些魔术字节。如果不是,则它不是有效的图像。
  • 我明白了,但是 $file 是从哪里来的呢?我们不需要 ['FileData'] 吗?你介意给我看一下 HTML 上传吗?
  • @Macris 这只是一个简洁的例子,想象一下我做了$file = $_FILES['Filedata'].;
  • 哦,太好了,我能想到的其他最安全的方法是使用 ImageMagick 读取和写入新图像,这将去除所有隐藏数据并避免保留恶意代码。非常感谢您的代码,我正急于推出我的网站!
猜你喜欢
  • 2014-09-04
  • 2011-08-29
  • 1970-01-01
  • 2011-03-19
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多