检查图像是否确实是图像 php

Check that an image is actually an image php

所以我有这个脚本可以将图像上传到服务器。 它允许 jpg 和 png 并将文件重命名为随机的 6 位数字。

<?php
if (isset($_FILES['file'])) {
    $file       = $_FILES['file'];
    $file_name  = $file['name'];
    $file_tmp   = $file['tmp_name'];
    $file_size  = $file['size'];
    $file_error = $file['error'];

    $file_ext = explode('.', $file_name);
    $file_ext = strtolower(end($file_ext));

    $allowed = array(
        'jpg',
        'png'
    );

    if (in_array($file_ext, $allowed)) {
        if ($file_error === 0) {
            if ($file_size <= 10000000) {
                $file_name_new    = mt_rand(100000, 999999) . '.' . $file_ext;
                $file_destination = 'files/' . $file_name_new;
                if (move_uploaded_file($file_tmp, $file_destination)) {
                    echo "<a href='$file_destination'>$file_name_new</a>";
                }
            }
        }
    }
}
?>

一切正常。它只允许具有指定扩展名.jpg 和.png 的文件。

我 运行 遇到的问题是您可以将 script.txt 等 txt 文件重命名为 [=26= .jpg 并且服务器将允许它,但它实际上不是图像。这提供了攻击的漏洞。

有什么我可以添加的东西可以实际验证正在上传的文件是图像吗?我听说过有关 getimagesize 的消息,但我不确定。我是 php.

的新手

您需要使用文件的 mimetype 才能知道它是什么类型的文件。扩展名不相关。

确实,您可以使用 getimagesize 来做到这一点:

<?php 
    ...
$size = getimagesize($file_name)); 

switch ($size['mime']) { 
    case "image/gif": 
        echo "Image is a gif"; 
        break; 
    case "image/jpeg": 
        echo "Image is a jpeg"; 
        break; 
    case "image/png": 
        echo "Image is a png"; 
        break; 
    case "image/bmp": 
        echo "Image is a bmp"; 
        break; 
} 
?>

来源:http://php.net/manual/en/function.image-type-to-mime-type.php