我发现这个代码段只会允许某些文件类型。它会工作吗,有人可以绕过它来上传他们想要的文件类型吗?并且有人可以解释子部分,我不知道它是如何工作的。
<?php
function CheckExt($filename, $ext) {
$name = strtolower($filename);
if(substr($name, strlen($name) -3, 3) == $ext)
return true;
else
return false;
}
?>
答案 0 :(得分:7)
检查扩展程序的更好方法
function checkExt($filename, $ext)
{
$fnExt = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if(!is_array($ext)) {
$ext = (array)$ext;
}
$ext = array_map('strtolower', $ext);
return in_array($fnExt, $ext);
}
然后您可以将其称为
var_dump(checkExt('test.temp', 'tmp')); // false
var_dump(checkExt('test.temp', array('tmp', 'temp'))); // true
避免使用substr,因为扩展长度未知(您也可以使用substr&amp; strrpos,但php为您提供此功能)
答案 1 :(得分:5)
通过更改文件扩展名不会更改文件内容,可以轻松绕过。因此,重命名为.exe
的{{1}}仍然是.jpg
,无论如何都要等待。您可以将它用于基本检查,但不要仅依靠它来验证文件类型。
此substr()
来电:
.exe
更好更简单地写为:
substr($name, strlen($name) -3, 3)
哪个PHP只是解释为'仅使用substr($name, -3)
'的最后3 个字符。
编辑:本身并不是更好因为文件扩展名不一定必须是3个字符。它们可能是2,它们可能是4,5,甚至10。这就是为什么我说,检查文件扩展名不是很可靠。
答案 2 :(得分:1)
我更喜欢白名单 Mimetypes我想允许使用的内容
$mimesGeneral = array(
'txt'=>'text/plain',
'doc'=>'application/msword',
'pdf'=>'application/pdf',
'xls'=>'application/x-excel',
'xls'=>'application/excel',
'xls'=>'application/vnd.ms-excel',
'rtf'=>'application/rtf',
'zip'=>'application/zip'
);
$success = false;
foreach($allowedMimes as $key=>$value){
if($_FILES['uploaded_file']['type'] == $value){
return true;
}
}
我使用黑名单后缀,例如'php','pl','exe'等...
答案 3 :(得分:0)
人们仍然可以上传他们想要的任何东西;他们只需要给文件一个特定的扩展名。
对于substr
,请参阅manual。