利用PHP實(shí)現(xiàn)智能文件類型檢測(cè)的實(shí)現(xiàn)代碼
更新時(shí)間:2011年08月02日 20:06:06 作者:
通常我們想嚴(yán)格限制文件類型的時(shí)候,可以簡(jiǎn)單地用$_FILES['myFile']['type'] 取得文件的 MIME類型然后來(lái)檢測(cè)它是否是合法的類型。
使用文件后綴和MIME類型檢測(cè)
通常我們想嚴(yán)格限制文件類型的時(shí)候,可以簡(jiǎn)單地用$_FILES['myFile']['type'] 取得文件的 MIME類型然后來(lái)檢測(cè)它是否是合法的類型。
或者我們可以取文件名的最后幾個(gè)字符來(lái)獲取文件后綴,不幸的是,這些方法并不足夠,可以很容易地改變文件的擴(kuò)展名繞過(guò)這個(gè)限制。此外,MIME類型信息是由瀏覽器發(fā)送的,而且,對(duì)于大多數(shù)瀏覽器,即使不是全部,是根據(jù)文件的擴(kuò)展名的來(lái)給出MIME類型信息的!因此,MIME類型,就像擴(kuò)展名一樣,可以很容易地欺騙。
使用“魔術(shù)字節(jié)”
確定文件類型的最佳方法是通過(guò)檢查文件的前幾個(gè)字節(jié) – 稱為“魔字節(jié)”。魔術(shù)字節(jié)本質(zhì)上是文件頭中不同長(zhǎng)度在2到40個(gè)字節(jié)之間的,或在文件末尾的簽名。有上百個(gè)類型的文件,他們中相當(dāng)多的文件類型有好幾個(gè)文件簽名與它們相關(guān)聯(lián)。在這里你可以看到一個(gè)文件簽名列表。
偷懶的辦法是使用fileinfo擴(kuò)展,PHP 5.3.0 默認(rèn)是啟用的(根據(jù)官方MANUAL),如果沒(méi)有啟用,你可以自己?jiǎn)⒂?
如在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 ,解壓出來(lái),在其中的share目錄有magic.mgc 、magic 兩個(gè)文件。
然后添加一個(gè)名為MAGIC的系統(tǒng)環(huán)境變量指向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...
}
處理圖像上傳
如果你打算只允許圖像上傳,那么你可以使用內(nèi)置的getimagesize()函數(shù),以確保用戶實(shí)際上是上傳一個(gè)有效的圖像文件。如果該文件不是有效的圖像文件,這個(gè)函數(shù)返回false。
// 假設(shè)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";
}
手動(dòng)讀取和解釋“魔法字節(jié)”
如果由于某種原因,你不能安裝FileInfo擴(kuò)展,那么你仍然可以手動(dòng)確定,通過(guò)讀取文件的前幾個(gè)字節(jié),并比較它們與已知的魔法與特定文件類型相關(guān)聯(lián)的字節(jié)的文件類型。這個(gè)過(guò)程肯定少許的試驗(yàn)和錯(cuò)誤,因?yàn)檫€有一種可能,有少數(shù)非法的魔法字節(jié)與合法文件格式關(guān)聯(lián)了。
然而這不是不可能的,幾年前,我被要求做一個(gè)只允許真正的 mp3 文件上傳的腳本文件,并且,當(dāng)時(shí)我們不能用 Fileinfo, 我們只能依靠這種手動(dòng)檢測(cè)的方式了.
我花了一段時(shí)間來(lái)解析一些mp3文件的非法魔法字節(jié),但很快,我得到了一個(gè)穩(wěn)定的上傳腳本。
在本文結(jié)束前,我想給大家一個(gè)警告: 確保你永遠(yuǎn)沒(méi)有調(diào)用一個(gè) include() 來(lái)包含一個(gè)上傳的文件,因?yàn)镻HP代碼很可能會(huì)巧妙地隱藏在圖片里面,并且圖片也可以成功的通過(guò)你的文件檢測(cè),當(dāng)這樣的腳本運(yùn)行時(shí),只可能給系統(tǒng)帶來(lái)破壞。
譯自:http://designshack.co.uk/articles/php-articles/smart-file-type-detection-using-php/
通常我們想嚴(yán)格限制文件類型的時(shí)候,可以簡(jiǎn)單地用$_FILES['myFile']['type'] 取得文件的 MIME類型然后來(lái)檢測(cè)它是否是合法的類型。
或者我們可以取文件名的最后幾個(gè)字符來(lái)獲取文件后綴,不幸的是,這些方法并不足夠,可以很容易地改變文件的擴(kuò)展名繞過(guò)這個(gè)限制。此外,MIME類型信息是由瀏覽器發(fā)送的,而且,對(duì)于大多數(shù)瀏覽器,即使不是全部,是根據(jù)文件的擴(kuò)展名的來(lái)給出MIME類型信息的!因此,MIME類型,就像擴(kuò)展名一樣,可以很容易地欺騙。
使用“魔術(shù)字節(jié)”
確定文件類型的最佳方法是通過(guò)檢查文件的前幾個(gè)字節(jié) – 稱為“魔字節(jié)”。魔術(shù)字節(jié)本質(zhì)上是文件頭中不同長(zhǎng)度在2到40個(gè)字節(jié)之間的,或在文件末尾的簽名。有上百個(gè)類型的文件,他們中相當(dāng)多的文件類型有好幾個(gè)文件簽名與它們相關(guān)聯(lián)。在這里你可以看到一個(gè)文件簽名列表。
偷懶的辦法是使用fileinfo擴(kuò)展,PHP 5.3.0 默認(rèn)是啟用的(根據(jù)官方MANUAL),如果沒(méi)有啟用,你可以自己?jiǎn)⒂?
如在windows下面:
復(fù)制代碼 代碼如下:
extension=php_fileinfo.dll
linux下面:
復(fù)制代碼 代碼如下:
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 ,解壓出來(lái),在其中的share目錄有magic.mgc 、magic 兩個(gè)文件。
然后添加一個(gè)名為MAGIC的系統(tǒng)環(huán)境變量指向magic 文件。如D:\software\PHP\extras\misc\magic
復(fù)制代碼 代碼如下:
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...
}
處理圖像上傳
如果你打算只允許圖像上傳,那么你可以使用內(nèi)置的getimagesize()函數(shù),以確保用戶實(shí)際上是上傳一個(gè)有效的圖像文件。如果該文件不是有效的圖像文件,這個(gè)函數(shù)返回false。
復(fù)制代碼 代碼如下:
// 假設(shè)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";
}
手動(dòng)讀取和解釋“魔法字節(jié)”
如果由于某種原因,你不能安裝FileInfo擴(kuò)展,那么你仍然可以手動(dòng)確定,通過(guò)讀取文件的前幾個(gè)字節(jié),并比較它們與已知的魔法與特定文件類型相關(guān)聯(lián)的字節(jié)的文件類型。這個(gè)過(guò)程肯定少許的試驗(yàn)和錯(cuò)誤,因?yàn)檫€有一種可能,有少數(shù)非法的魔法字節(jié)與合法文件格式關(guān)聯(lián)了。
然而這不是不可能的,幾年前,我被要求做一個(gè)只允許真正的 mp3 文件上傳的腳本文件,并且,當(dāng)時(shí)我們不能用 Fileinfo, 我們只能依靠這種手動(dòng)檢測(cè)的方式了.
我花了一段時(shí)間來(lái)解析一些mp3文件的非法魔法字節(jié),但很快,我得到了一個(gè)穩(wěn)定的上傳腳本。
在本文結(jié)束前,我想給大家一個(gè)警告: 確保你永遠(yuǎn)沒(méi)有調(diào)用一個(gè) include() 來(lái)包含一個(gè)上傳的文件,因?yàn)镻HP代碼很可能會(huì)巧妙地隱藏在圖片里面,并且圖片也可以成功的通過(guò)你的文件檢測(cè),當(dāng)這樣的腳本運(yùn)行時(shí),只可能給系統(tǒng)帶來(lái)破壞。
譯自:http://designshack.co.uk/articles/php-articles/smart-file-type-detection-using-php/
您可能感興趣的文章:
- php文件類型MIME對(duì)照表(比較全)
- php準(zhǔn)確獲取文件MIME類型的方法
- php實(shí)現(xiàn)獲取文件mime類型的方法
- php實(shí)現(xiàn)不通過(guò)擴(kuò)展名準(zhǔn)確判斷文件類型的方法【finfo_file方法與二進(jìn)制流】
- PHP判斷上傳文件類型的解決辦法
- php獲取文件類型和文件信息的方法
- php 上傳文件類型判斷函數(shù)(避免上傳漏洞 )
- php 文件上傳后綴名與文件類型對(duì)照表(幾乎涵蓋所有文件)
- php限制上傳文件類型并保存上傳文件的方法
- php中header設(shè)置常見(jiàn)文件類型的content-type
- PHP實(shí)現(xiàn)的獲取文件mimes類型工具類示例
相關(guān)文章
php性能分析之php-fpm慢執(zhí)行日志slow log用法淺析
這篇文章主要介紹了php性能分析之php-fpm慢執(zhí)行日志slow log用法,結(jié)合實(shí)例形式分析了php慢執(zhí)行日志的功能與相關(guān)使用技巧,需要的朋友可以參考下2016-10-10PHP獲取指定函數(shù)定義在哪個(gè)文件中以及其所在的行號(hào)實(shí)例
這篇文章主要介紹了PHP獲取指定函數(shù)定義在哪個(gè)文件中以及其所在的行號(hào)實(shí)例,需要的朋友可以參考下2014-05-05php讀取txt文件并將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)
這篇文章主要介紹了php讀取txt文件并將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)的方法和示例代碼,小文件大家可以參考第一種,大文件導(dǎo)入的話請(qǐng)參考第二種。2016-02-02PHP實(shí)現(xiàn)全角字符轉(zhuǎn)為半角方法匯總
這篇文章主要給大家匯總介紹了PHP實(shí)現(xiàn)全角字符轉(zhuǎn)為半角方法,從簡(jiǎn)單到復(fù)雜,小伙伴們根據(jù)自己的需求來(lái)自由選擇吧。2015-07-07php5 pdo新改動(dòng)加載注意事項(xiàng)
想試試pdo怎么用,把 extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll2008-09-09PHP實(shí)現(xiàn)sha-256哈希算法實(shí)例代碼
最近在PHP項(xiàng)目中使用到了hmac_sha256加密方式,下面這篇文章主要給大家介紹了關(guān)于PHP實(shí)現(xiàn)sha-256哈希算法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01Highcharts?圖表中圖例顯示狀態(tài)存儲(chǔ)的功能設(shè)計(jì)詳解
這篇文章主要介紹了Highcharts?圖表中圖例顯示狀態(tài)存儲(chǔ)的功能設(shè)計(jì)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03