PHP 报告不正确的 MIME 类型



我正在设计一个简单的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>";
}

$_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'], '.') .

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

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

你不能相信哑剧类型。如果您想合理可靠地知道它是什么类型的文件,则必须使用像file这样的实用程序来嗅探数据。

相关内容