2012-11-14 163 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