2012-11-14 126 views
0

我正在设计一个简单的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类型的问题。PHP报告不正确的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

服务器可以看到上传的浏览器所说的类型。

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

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

1

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

使用尝试获得MIME类型从$_FILES['userfile']['tmp_name']

$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'], '.')猜测。

+0

我不想使用上传文件的扩展名,因为这非常容易欺骗。我会检查finfo()方法,谢谢。 – ad2476