【问题标题】:PHP reports incorrect MIME typePHP 报告错误的 MIME 类型
【发布时间】:2012-11-03 13:36:17
【问题描述】:

我正在设计一个简单的 PHP 脚本来允许上传 *.cpp 源文件。作为一项基本的安全措施,我会在将临时文件移动到永久位置之前检查其 MIME 类型。当我在终端(在 Mac OS X 上)运行file --mime myfile.cpp 时,它显示为text/x-c。然而,出于某种原因,服务器将其视为application/octet-stream。在/etc/mime.types 中,“cpp”扩展名在text/x-c++src 下,这让我相信这是 Mac 上 MIME 类型的问题。

我在 Ubuntu 上尝试了相同的程序,它运行良好(它显示为 text/x-c++src)。我在两台计算机上都使用 Chrome。

这本身并不完全是一个编程问题,但可能有一些我不熟悉的 PHP 技巧。

$temp_file=$_FILES["file"]["type"];
if(($temp_file!="text/x-c++src")||($temp_file!="text/x-c")) {
    echo "<p style=\"color:red;font-style:italic\">Please upload a valid C++ file.</p>";
}

【问题讨论】:

    标签: php mime-types mime


    【解决方案1】:

    $_FILES['userfile']['type'] 包含浏览器发送的 mime 类型(在上传期间)。你可以使用它,但你不能信任它。

    尝试从 $_FILES['userfile']['tmp_name'] 获取 mime 类型:

    $mime = mime_content_type($tmp_name);
    // or, as this is deprecated:
    $info = new finfo(FILEINFO_MIME_TYPE);
    $mime = $info->file($tmp_name);
    

    或者,您可以通过 strrchr($_FILES['userfile']['name'], '.') 中的原始文件扩展名来猜测。

    【讨论】:

    • 我不想使用上传文件的扩展名,因为这非常容易被欺骗。不过,我会检查 finfo() 方法,谢谢。
    【解决方案2】:

    服务器会看到上传它的浏览器所说的任何类型。

    浏览器通常不太擅长确定文件类型,恶意上传者总是可以覆盖它。

    你不能相信 mime 类型。如果你想合理可靠地知道它是什么类型的文件,你必须使用像 file 这样的工具来嗅探数据。

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 2016-08-18
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多