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()
上传文件始终是一种很好的做法。因为它确保任何恶意用户都没有试图欺骗执行上载文件的脚本。