我使用文件扩展名来验证上传文件,如 word excel pdf 等?
但是如果用户更改他们的文件扩展名,那么他们可以上传他们想要的任何文件。
如果用户更改其文件扩展名之后他们应该无法上传文件,我想检查文件类型。
任何人都可以帮助
我使用文件扩展名来验证上传文件,如 word excel pdf 等?
但是如果用户更改他们的文件扩展名,那么他们可以上传他们想要的任何文件。
如果用户更改其文件扩展名之后他们应该无法上传文件,我想检查文件类型。
任何人都可以帮助
您还应该检查 mimetypes,例如:
$allowedMimes = array('image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/bmp', 'image/wbmp');
//getting the mime type (it can be different from the extension) Be careful!
$imgInfo = getimagesize(imagePath);
$type = strtolower($imgInfo['mime']);
//hey dude!! This is a fake image!!
if(!in_array($type, $allowedMimes)){
//We delete it!!
unlink(imagePath);
}else{
//do whatever with the image...
}
您可以在此处找到有关 mime 类型的更多信息。
为了安全
无论类型如何,将所有文件移出 webroot。
有一个脚本,download.php 或其他,获取文件的 ID,验证谁登录,如果一切正常,获取文件,将其读出到浏览器,并发送适当的下载标题。
header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename=file.ext');
header("Content-Length: " . filesize('../not_in_web_root/file.ext'));
header("Content-Transfer-Encoding: binary");
readfile('../not_in_web_root/file.ext');
exit;
如果您只允许图像,则使用类似的函数getimagesize()
,如果它的大小是图像,但仍然不允许直接访问它,因为 PHP 可能嵌入其中。
如果您向用户提供文件系统功能,请根据数据库中的值而不是访问真实文件,将其设为虚拟功能。
您可以查看文件的 MIME 类型吗?http://us2.php.net/manual/en/fileinfo.constants.php