我有一个输入,您可以在其中上传图像,唯一允许的图像类型为:png,jpg,jpeg。在将图像插入数据库之前,它会检查图像是否为png,jpg,jpeg。但是现在出于安全原因,我需要在第一次检查之前或之后检查mime类型。
我该怎么做?这是我的代码:
$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类型,开发人员通常依赖于$_FILE['input_name']['type']
。但这绝对是脆弱的。因为恶意用户可以将image/jpg
,image/png
,image/gif
等之一设置为MIME类型,所以MIME类型实际上不是图像。在这种情况下,恶意用户将获得您的脚本密码,以上传另一个文件而不是图像。
因此,我建议您不要依赖以下代码片段获取文件的MIME
$_FILE['input_name']['type'];
相反,我建议使用此mime_content_type()
函数来获取MIME类型,但要借助其他PHP的内置函数。那就是is_uploaded_file()
功能。它的作用是:
这有助于确保恶意用户没有试图欺骗脚本以处理不应在其上的文件工作中,例如/ etc / passwd。
如果有可能,这种检查尤为重要对上传的文件所做的任何操作都可能会将其内容透露给用户,甚至是同一系统上的其他用户。
因此,要使此功能正常运行,它需要一个特定参数。请查看下面的代码:
if (is_uploaded_file($_FILE['input_name']['tmp_name'])) {
// do other stuff
}
此函数成功返回true
,否则返回false
。因此,如果它返回true
,那么您可以使用该文件。有了这个功能。现在mime_content_type()
功能开始发挥作用。怎么样?看t
if (is_uploaded_file($_FILE['input_name']['tmp_name'])) {
// Notice how to grab MIME type
$get_mime_type = mime_content_type($_FILE['input_name']['tmp_name']);
// Now you move/upload your file
move_uploaded_file ($_FILE['input_name']['tmp_name'] , $destination);
}
BTW,对于新手,请勿尝试使用此功能获取MIME类型的远程URL。下面的代码将不起作用:
mime_content_type('http://www.example.com/uploads/example.png');
但是下面的一个可以工作:
mime_content_type('/source/to/your/file/etc.png');
希望您从现在开始喜欢上传文件。