根据扩展名判断类型的弊端
正如我刚开始接触 php 一样,我们许多人在使用 php 进行文件的上传和存储时,都会给文件进行重名命并保存到可写文件夹下,然后我们在其中一个失误的地方便是采用上传文件的扩展名作为判断文件类型的依据。这样做其实与后门大开无异,举一个简单的例子,通过扩展名判断一般是字符串的截取判断,或者是使用$_FILE数组判断,然后如果用户上传的文件名为 image.php.png, image.png.php, image.php%****.png 之类的话,判断就会出错。另外,$_FILES['type']可能被篡改。
夜已深,话不多言。送上我判断文件名的方法:读取文件头四个字节作为判断。
下面直接上代码,相信略有些php功底的朋友,读来都不成问题。我实现的是仅支持word和pdf文件,且文件大小小于512kb:
$tmpname = $_FILES ['userfile'] ['tmp_name'];
if(is_uploaded_file($tmpname)) {
$mimetype = detectMIME($tmpname);
$tuozhanming = getFileExt($filename, $mimetype);
if($tuozhanming == "type_error"){
echo '仅支持word和pdf文件,且文件大小小于512kb:<a href='.$reurl.'>请重试</a>';
exit();
}
}else{