PHP:如何正确检查文件的MIME类型?

PHP:如何正确检查文件的MIME类型?,php,mime,Php,Mime,我有一个可以上传图像的输入,唯一允许的图像类型是: png, jpg, jpeg 在将图像插入数据库之前,它会检查图片是否为png、jpg、jpeg。但是现在出于安全原因,我需要在第一次检查之前或之后检查mime类型 我该怎么做?这是我的代码: <?php $iAmountOfFiles = count($_FILES['Filename']['name']); while($iAmountOfFiles >= 1) { $iAmountOfFiles--;

我有一个可以上传图像的输入,唯一允许的图像类型是:

png, jpg, jpeg
在将图像插入数据库之前,它会检查图片是否为png、jpg、jpeg。但是现在出于安全原因,我需要在第一次检查之前或之后检查mime类型

我该怎么做?这是我的代码:

<?php

$iAmountOfFiles = count($_FILES['Filename']['name']);

while($iAmountOfFiles >= 1) {

    $iAmountOfFiles--;

    $aFileProperties = pathinfo($_FILES['Filename']['name'][$iAmountOfFiles]);
    if(!in_array(strtolower($aFileProperties["extension"]), $aExtensionWhitelist)) {
        echo "Bestands type niet toegestaan";
        // exit;
        continue;
    }

    $sTarget = ROOT.BACKEND."/pages/bezienswaardigheden-toevoegen/uploads/";
    $sUniqueFileNameHash = hash('adler32', time().rand());
    $Filename = basename($sUniqueFileNameHash."-".$_FILES['Filename']['name'][$iAmountOfFiles]);
    $Filename = basename($aFileProperties["filename"]."-".$sUniqueFileNameHash.".".strtolower($aFileProperties["extension"]));

    // Writes the Filename to the server
    if(move_uploaded_file($_FILES['Filename']['tmp_name'][$iAmountOfFiles], $sTarget.$Filename)) {

    // here needs to come the mime check

要获得MIME类型,开发人员通常依赖于
$\u文件['input\u name']['type']
。但这是绝对脆弱的。因为恶意用户可以将
image/jpg
image/png
image/gif
等MIME类型之一设置为实际不是图像的文件。在这种情况下,恶意用户可能会获得您的脚本通行证,以上载其他文件而不是图像,并出于其目的执行您的脚本,这是危险的

因此,我建议您不要依赖下面的代码片段来获取文件的MIME

$_FILE['input_name']['type'];
相反,我建议使用这个
mime\u content\u type()
函数来获取mime类型,但要借助其他PHP的内置函数。这就是
is\u uploaded\u file()
函数。它所做的是:

这有助于确保恶意用户没有尝试 诱使脚本处理不应在其上运行的文件 正在工作——例如,/etc/passwd

如果有任何可能 对上传的文件所做的任何操作都可能会将其内容泄露给用户 用户,甚至是同一系统上的其他用户

因此,要使此函数正常工作,需要一个特定的参数。查看下面的代码:

if (is_uploaded_file($_FILE['input_name']['tmp_name'])) {
    // do other stuff
}
此函数在成功时返回
true
,否则返回
false
。因此,如果它返回
true
,则您可以使用该文件。多亏了这个功能。现在
mime\u content\u type()
功能开始发挥作用。怎样请看下面的代码:

if (is_uploaded_file($_FILE['input_name']['tmp_name'])) {
    // Notice how to grab MIME type
    $mime_type = mime_content_type($_FILE['input_name']['tmp_name']);

    // If you want to allow certain files
    $allowed_file_types = ['image/png', 'image/jpeg', 'application/pdf'];
    if (! in_array($mime_type, $allowed_file_types)) {
        // File type is NOT allowed
    }

    // Set up destination of the file
    $destination = '/path/to/move/your/file/';

    // Now you move/upload your file
    if (move_uploaded_file ($_FILE['input_name']['tmp_name'] , $destination)) {
        // File moved to the destination
    }
}
顺便说一句,对于新手,不要尝试使用此函数获取MIME类型的远程url。以下代码将不起作用:

mime_content_type('http://www.example.com/uploads/example.png');
但下面的一种方法会起作用:

mime_content_type('/source/to/your/file/etc.png');

希望您从现在开始喜欢上传文件。

请阅读。在你来问这个问题之前,你应该先自己付出一些努力。你的问题目前没有任何迹象表明你确实尝试过,但你基本上只是在这里放弃了你的要求。在这里,简单地问一句“我该怎么做?”是不合适的。我们在这里不是为了让你把任何研究外包给我们。这能回答你的问题吗?在这里<代码>$result=new finfo();打印$result->file($filename,FILEINFO\u MIME\u TYPE)
移动上传的文件
也会检查上传文件是否有效。如果文件名不是有效的上传文件,则不会执行任何操作,
move\u upload\u file()
将返回
FALSE
“@Fahmi是的!但是,在使用
move\u uploaded\u file()
上传文件之前,使用
is\u uploaded\u file()
上传文件始终是一种很好的做法。因为它确保任何恶意用户都没有试图欺骗执行上载文件的脚本。