PHP文件上传安全性

PHP文件上传安全性,php,Php,我使用文件扩展名验证上传文件,如word excel pdf等 但若用户更改了他们的文件扩展名,那个么他们可以上传任何他们想要的文件 我想功能,检查类型的文件,如果用户改变他们的文件扩展名后,他们应该不能上传文件 有人能帮你吗?你可以看看文件的mime类型吗 您还应该检查mimetype,例如: $allowedMimes = array('image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/bmp', 'image/wbmp')

我使用文件扩展名验证上传文件,如word excel pdf等

但若用户更改了他们的文件扩展名,那个么他们可以上传任何他们想要的文件

我想功能,检查类型的文件,如果用户改变他们的文件扩展名后,他们应该不能上传文件


有人能帮你吗?你可以看看文件的mime类型吗

您还应该检查mimetype,例如:

$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;
  • 在可能的情况下,通过检查扩展名和mimetype,仅接受要接受的文件。它的 甚至可以接受php,只要您不允许它执行或不允许用户直接访问它
如果您只允许使用图像,那么请使用类似于
getimagesize()
的函数,如果它具有图像大小,但仍然不允许直接访问它,因为PHP可能嵌入其中


如果您向用户提供文件系统功能,请根据数据库中的值而不是对真实文件的访问,将其设置为虚拟文件系统。

关于文件上载安全性,您应该了解什么:您希望使用哪种上载?图像或任何东西?可能的重复,以及
fopen()
有什么问题?此外,仅使用
getimagesize()
无法防止jpeg伪装脚本。我已经删除了fopen。不需要,对不起:)