PHP验证文件上传

PHP验证文件上传,php,image,upload,pdo,Php,Image,Upload,Pdo,我是一名PHP初学者,目前正在学习“验证文件上传”部分 我制作了一个test.php页面,其中包含以下代码: var_dump(@$_FILES['file']['type']); 首先,我上传了一张图片“img.gif”,它返回: string 'image/gif' (length=9) string 'image/jpeg' (length=10) 然后,我将图像的扩展名更改为“.jpg”,它返回: string 'image/gif' (length=9) string 'ima

我是一名PHP初学者,目前正在学习“验证文件上传”部分

我制作了一个test.php页面,其中包含以下代码:

var_dump(@$_FILES['file']['type']);
首先,我上传了一张图片“img.gif”,它返回:

string 'image/gif' (length=9)
string 'image/jpeg' (length=10)
然后,我将图像的扩展名更改为“.jpg”,它返回:

string 'image/gif' (length=9)
string 'image/jpeg' (length=10)
所以我意识到$_FILES[“file”][“type”]只返回上传的文件扩展名,但实际上没有检查它是什么文件

在此页面中,有一个代码:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
$allowedExts=array(“gif”、“jpeg”、“jpg”、“png”);
$extension=end(分解(“.”,$_文件[“文件”][“名称]);
如果(($_文件[“文件”][“类型”]=“图像/gif”)
||($_文件[“文件”][“类型”]=“图像/jpeg”)
||($_文件[“文件”][“类型”]=“图像/jpg”)
||($_文件[“文件”][“类型”]=“图像/png”))
&&($_文件[“文件”][“大小”]<20000)
&&in_数组($extension$allowedExts))
我想知道为什么上面的代码会检查文件扩展名两次?我从上述代码中删除了一些,这是我的新代码:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if (($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts))
$allowedExts=array(“gif”、“jpeg”、“jpg”、“png”);
$extension=end(分解(“.”,$_文件[“文件”][“名称]);
if($_文件[“文件”][“大小”]<20000)&&in_数组($extension,$allowedExts))
我的代码正确吗?或者你有没有更好的方法来验证上传文件是否是图像

谢谢

$allowedExts=array(“gif”、“jpeg”、“jpg”、“png”);
$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
$extension=end(分解(“.”,$_文件[“文件”][“名称]); 如果(($_文件[“文件”][“类型”]=“图像/gif”) ||($_文件[“文件”][“类型”]=“图像/jpeg”) ||($_文件[“文件”][“类型”]=“图像/jpg”) ||($_文件[“文件”][“类型”]=“图像/png”)) &&($_文件[“文件”][“大小”]<20000) &&in_数组($extension$allowedExts))
这会被检查两次,因为文件的扩展名和“文件类型”可能不同,因此无法上载扩展名为.png的可执行文件

在修改后的代码中,可以上载扩展名已修改的不同类型的文件。就像他们可以上传扩展名为“.png”的word文档一样


新代码只是检查扩展名,没有重复检查。

新代码只检查文件的扩展名和大小。它不检查文件的类型


我强烈建议使用您的旧代码,因为它会检查文件类型。

您应该将文件的tmp_名称*传递给,它将为您提供图像的大小和类型(如果是图像)。如果传递的参数是文件而不是图像,则返回false,这将允许您进行验证

编辑:唯一可靠的图像验证方法是使用GD或Imagick-复制图像

*:我的意思是,上传后创建的临时文件

例如:

if ($_SERVER['REQUEST_METHOD'] === 'POST')
{
    $file = $_FILES['file']['tmp_name'];
    if (file_exists($file))
    {
        $imagesizedata = getimagesize($file);
        if ($imagesizedata === FALSE)
        {
            //not image
        }
        else
        {
            //image
            //use $imagesizedata to get extra info
        }
    }
    else
    {
        //not file
    }
}

此代码仅用于一般用途。如果没有上传任何文件,您将获得
$\u文件['file']['size']=0
$\u文件['file']['tmp\u name']='
$\u文件['file']['error']=4
。另见。有关错误值,请参见。

我上传了一个扩展名为png的exe文件,页面返回:字符串'image/png'(长度=9)var_dump(@$\u FILES['file']['type'])返回了exe文件的字符串'image/png'(长度=9),但扩展名为png,因此它没有检查文件类型,只检查扩展名。为什么我的帖子获得了向下投票?我只是想确保在w3schools的代码中不需要使用$_FILES[“file”][“type”]来提及getimagesize函数。请注意,它会检查它是否是图像,但这并不意味着它不是经过处理的图像,请参阅:我建议使用imagecreatefromstring等函数重新创建图像,并将其转换为png等格式Arie 50分钟前从>PHP文档:
不要使用getimagesize()检查给定文件是否为有效图像。