如何使用 MIME 验证文件


How to validate files using MIME?

我想使用 php 验证服务器中的文件类型。现在,我已经通过检查文件的文件扩展名类型对其进行了验证。这很好用,但问题是这不是以用户身份验证文件的最佳方式,更改让我们将文本文件转换为 jpeg 并且仍然能够上传它。

所以我想做的是添加另一种验证方法,我还想使用 php 检查文件的 MIME 类型,以识别文件是图像、视频还是音频。

所以我的问题是如何编码,以便我可以在 php 中使用 MIME 类型来验证文件?另外,如果我有一个非常大的文件,MIME 验证需要很长时间才能开始还是立即验证?

以下是我目前对图像的代码,它使用 php 代码来检查文件类型:

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    }
  }
else
  {
  echo "Invalid file";
  }
?> 

MIME类型的查找通常非常快,在PHP中你可以使用finfo扩展来完成。例:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, '/path/to/file.jpg'); // image/jpeg
finfo_close($finfo);

此外,您不应依赖$_FILES超全局的type索引,因为该值可能会被欺骗为攻击者可能想要的任何值。当然,文件扩展名也是如此。

您可以使用 getID3((。此外,获取图像大小可以使您放心。

javascript代码在这里似乎无关紧要。此外,您可能知道$_FILES中指示的类型应仅被视为用户/浏览器的建议。