国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

利用PHP實現智能文件類型檢測的實現代碼

2024-05-04 23:17:22
字體:
來源:轉載
供稿:網友
使用文件后綴和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下面如不能正常工作:
可參考:#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代碼很可能會巧妙地隱藏在圖片里面,并且圖片也可以成功的通過你的文件檢測,當這樣的腳本運行時,只可能給系統帶來破壞。
譯自:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夏津县| 久治县| 奉贤区| 禄劝| 宁陵县| 沂水县| 棋牌| 武陟县| 绵阳市| 乌苏市| 呼伦贝尔市| 连平县| 潮安县| 东乡族自治县| 三门峡市| 乌兰察布市| 花莲县| 洛川县| 弥渡县| 资源县| 托克逊县| 太湖县| 云浮市| 乌恰县| 将乐县| 洛川县| 清苑县| 宜昌市| 华坪县| 南涧| 深泽县| 浙江省| 汤阴县| 贞丰县| 大方县| 合江县| 高青县| 琼中| 沅陵县| 河北区| 浦东新区|