-1

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

但是如果用户更改他们的文件扩展名,那么他们可以上传他们想要的任何文件。

如果用户更改其文件扩展名之后他们应该无法上传文件,我想检查文件类型。

任何人都可以帮助

4

3 回答 3

1

您还应该检查 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 类型的更多信息。

于 2013-02-15T11:47:17.777 回答
1

为了安全

无论类型如何,将所有文件移出 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 可能嵌入其中。

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

于 2013-02-15T11:58:00.037 回答
0

您可以查看文件的 MIME 类型吗?http://us2.php.net/manual/en/fileinfo.constants.php

于 2013-02-15T11:45:16.693 回答