我正在设计一个简单的PHP脚本,以允许上传* .cpp源文件。作为一项基本的安全措施,我会在将临时文件移动到永久位置之前检查它的MIME类型。当我在终端(在Mac OS X上)运行file --mime myfile.cpp
时,它显示为text/x-c
。然而,由于某种原因,服务器将其视为application/octet-stream
。在/etc/mime.types
中,“{c}”扩展位于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>";
}
答案 0 :(得分:1)
$_FILES['userfile']['type']
包含浏览器发送的mime类型(在上传期间)。你可以使用它,但你不能相信它。
尝试使用以下内容从$_FILES['userfile']['tmp_name']
获取mime-type
$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'], '.')
中的原始文件名扩展来猜测。
答案 1 :(得分:0)
服务器会看到上传它的浏览器所说的任何类型。
浏览器通常不太擅长确定文件类型,恶意上传程序总是可以覆盖它。
你不能相信mime类型。如果您想合理可靠地知道它是什么类型的文件,您必须使用file
之类的实用程序来嗅探数据。