利用PHP實現智慧型檔案類型檢測的實現代碼

來源:互聯網
上載者:User

使用檔案尾碼和MIME類型檢測
通常我們想嚴格限制檔案類型的時候,可以簡單地用$_FILES['myFile']['type']  取得檔案的 MIME類型然後來檢測它是否是合法的類型。
或者我們可以取檔案名稱的最後幾個字元來擷取檔案尾碼,不幸的是,這些方法並不足夠,可以很容易地改變檔案的副檔名繞過這個限制。此外,MIME類型資訊是由瀏覽器發送的,而且,對於大多數瀏覽器,即使不是全部,是根據檔案的副檔名的來給出MIME類型資訊的!因此,MIME類型,就像副檔名一樣,可以很容易地欺騙。
使用“魔術位元組”
確定檔案類型的最佳方法是通過檢查檔案的前幾個位元組 – 稱為“魔位元組”。魔術位元組本質上是檔案頭中不同長度在2到40個位元組之間的,或在檔案末尾的簽名。有上百個類型的檔案,他們中相當多的檔案類型有好幾個檔案簽名與它們相關聯。在這裡你可以看到一個檔案簽名列表。
偷懶的辦法是使用fileinfo擴充,PHP 5.3.0 預設是啟用的(根據官方MANUAL),如果沒有啟用,你可以自己啟用
如在windows下面: 複製代碼 代碼如下:extension=php_fileinfo.dll

linux下面: 複製代碼 代碼如下:extension=fileinfo.so
#如不能正常工作,再加上下面這條
#mime_magic.magicfile=/usr/share/file/magic

windows下面如不能正常工作:
可參考:http://www.php.net/manual/en/fileinfo.installation.php#82570
下載file-5.03-bin.zip ,解壓出來,在其中的share目錄有magic.mgc 、magic 兩個檔案。
然後添加一個名為MAGIC的系統內容變數指向magic 檔案。如D:\software\PHP\extras\misc\magic   複製代碼 代碼如下:function getFileMimeType($file) {
$buffer = file_get_contents($file);
$finfo = new finfo(FILEINFO_MIME_TYPE);
return $finfo->buffer($buffer);
}
$mime_type = getFileMimeType($file);
switch($mime_type) {
case "image/jpeg":
// your actions go here...
}

處理映像上傳
如果你打算只允許映像上傳,那麼你可以使用內建的getimagesize()函數,以確保使用者實際上是上傳一個有效影像檔。如果該檔案不是有效影像檔,這個函數返回false。 複製代碼 代碼如下:// 假設file input 域的name 屬性為myfile
$tempFile = $_FILES['myFile']['tmp_name']; // path of the temp file created by PHP during upload
$imginfo_array = getimagesize($tempFile); // returns a false if not a valid image file
if ($imginfo_array !== false) {
$mime_type = $imginfo_array['mime'];
switch($mime_type) {
case "image/jpeg":
// your actions go here...
}
}
else {
echo "This is not a valid image file";
}

手動讀取和解釋“魔法位元組”
如果由於某種原因,你不能安裝FileInfo擴充,那麼你仍然可以手動確定,通過讀取檔案的前幾個位元組,並比較它們與已知的魔法與特定檔案類型相關聯的位元組的檔案類型。這個過程肯定少許的實驗和錯誤,因為還有一種可能,有少數非法的魔法位元組與合法檔案格式關聯了。
然而這不是不可能的,幾年前,我被要求做一個只允許真正的 mp3 檔案上傳的指令檔,並且,當時我們不能用 Fileinfo, 我們只能依靠這種手動檢測的方式了.
我花了一段時間來解析一些mp3檔案的非法魔法位元組,但很快,我得到了一個穩定的上傳指令碼。
在本文結束前,我想給大家一個警告: 確保你永遠沒有調用一個 include() 來包含一個上傳的檔案,因為PHP代碼很可能會巧妙地隱藏在圖片裡面,並且圖片也可以成功的通過你的檔案檢測,當這樣的指令碼運行時,只可能給系統帶來破壞。
譯自:http://designshack.co.uk/articles/php-articles/smart-file-type-detection-using-php/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.