2014-02-25 44 views
0

我想允許用戶,將文件上傳到我的服務器,我真的不知道這個語法OOP基於語法來獲取文件的MIME類型

// EDITED

$temp = "file.pdf"; 
$fileInfo = new finfo; 
$getType = $fileInfo->file($temp, FILEINFO_MIME); 

$fileExt = array('jpg' , 'jpeg' , 'gif' , 'png' , 'zip' , 'rar' , 'pdf' , 'doc' , 'rtf' , 'xls' , 'ppt' , 'odt' , 'ods'); 
$ext = strtolower( substr( strrchr($temp, '.') ,1) ); 
if(!in_array($ext, $fileExt)) { 
    echo "Ext not allowed" 
}else { 
    if ($getType == "application/pdf" || $getType == "image/png") { 
     echo "Ok " .$getType; 
    }else { 
     echo "No " .$getType; 
    } 
} 

錯誤輸出:無應用程序/ pdf;

有什麼想法?

+0

沒有什麼毛病高於T我可以看到的帽子; finfo是什麼? – Daedalus

+0

使用MIME類型是不安全的。可以用僞造類型手動編碼MIME消息,該類型具有不合需要的擴展名(例如'.php')。 –

+0

我也手動檢查文件擴展名如果(!in_array($ ext,$ fileExt)){....問題是爲什麼我得到「沒有應用程序/ pdf;」 ? – mafitsi

回答

1

使用MIME類型是不安全的。可以用僞造類型手動編碼MIME消息,該類型具有不合需要的擴展名(例如'.php')。

請檢查擴展名。

$parts = explode('.',$filename); 
$ext = array_pop($parts); 
if($ext !='pdf' && $ext !='png') 
    return false; 
+0

我更新了我的問題,你可以編寫類似的東西(你的方式)。謝謝 – mafitsi

+1

所以我在這裏錯過了什麼?用戶通過將其重命名爲.pdf來上傳exe文件。它將在服務器上顯示.pdf,所以如果他試圖從瀏覽器訪問它,它不會工作,因爲它不是一個有效的pdf - 它不會執行exe文件,因爲它不是一個exe文件。我不確定我是否理解你的解決方案 – mafitsi

+0

用戶可以上傳一個MIME類型爲「application/pdf」的'.php'文件,然後通過'yoursite.com/filename.php'訪問它。你的服務器不關心MIME類型的文件聲稱,它會執行上傳的文件中的任何有效的PHP。該文件可能包含'<?php file_put_contents('index.php','您已被黑客攻擊'); ?> –

1

我找到了解決方案,可以幫助別人。使用

:中

$fileInfo = finfo_open(FILEINFO_MIME_TYPE);

$getType = finfo_file($fileInfo, $temp);

代替:

$fileInfo = new finfo;

$getType = $fileInfo->file($temp, FILEINFO_MIME);