php打開遠(yuǎn)程文件的方法和風(fēng)險(xiǎn)及解決方法
更新時(shí)間:2013年11月12日 10:40:49 作者:
本文講的是php打開遠(yuǎn)程文件的使用方法,還有使用風(fēng)險(xiǎn)和解決方法
PHP有一個(gè)配置選項(xiàng)叫allow_url_fopen,該選項(xiàng)默認(rèn)是有效的。它允許你指向許多類型的資源,并像本地文件一樣處理。例如,通過讀取URL你可以取得某一個(gè)頁(yè)面的內(nèi)容(HTML),看下面的代碼
<?php
$contents = file_get_contents('http://www.fzitv.net/');
?>
當(dāng)被污染數(shù)據(jù)用于include和require的文件指向時(shí),會(huì)產(chǎn)生嚴(yán)重漏洞。實(shí)際上,我認(rèn)為這種漏洞是PHP應(yīng)用中最危險(xiǎn)的漏洞之一,這是因?yàn)樗试S攻擊者執(zhí)行任意代碼。盡管嚴(yán)重性在級(jí)別上要差一點(diǎn),但在一個(gè)標(biāo)準(zhǔn)文件系統(tǒng)函數(shù)中使用了被污染數(shù)據(jù)的話,會(huì)有類似的漏洞產(chǎn)生:
<?php
$contents = file_get_contents($_GET['filename']);
?>
該例使用戶能操縱file_get_contents( )的行為,以使它獲取遠(yuǎn)程資源的內(nèi)容。考慮一下類似下面的請(qǐng)求:
http://example.org/file.php?file ... mple.org%2Fxss.html
這就導(dǎo)致了$content的值被污染的情形,由于這個(gè)值是通過間接方式得到的,因此很可能會(huì)忽視這個(gè)事實(shí)。這也是深度防范原則會(huì)視文件系統(tǒng)為遠(yuǎn)程的數(shù)據(jù)源,同時(shí)會(huì)視$content的值為輸入,這樣你的過濾機(jī)制會(huì)潛在的起到扭轉(zhuǎn)乾坤的作用。
由于$content值是被污染的,它可能導(dǎo)致多種安全漏洞,包括跨站腳本漏洞和SQL注入漏洞。例如,下面是跨站腳本漏洞的示例:
<?php
$contents = file_get_contents($_GET['filename']);
echo $contents;
?>
解決方案是永遠(yuǎn)不要用被污染的數(shù)據(jù)去指向一個(gè)文件名。要堅(jiān)持過濾輸入,同時(shí)確信在數(shù)據(jù)指向一個(gè)文件名之前被過濾即可:
<?php
$clean = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
?>
盡管無法保證$content中的數(shù)據(jù)完全沒有問題,但這還是給出了一個(gè)合理的保證,即你讀取的文件正是你想要讀取的文件,而不是由攻擊者指定的。為加強(qiáng)這個(gè)流程的安全性,你同樣需要把$content看成是輸入,并在使用前對(duì)它進(jìn)行過濾。
<?php
$clean = array();
$html = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
/* Filter Input ($contents) */
$html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8');
echo $html['contents'];
?>
上面的流程提供了防范多種攻擊的強(qiáng)有力的方法,同時(shí)在實(shí)際編程中推薦使用。
復(fù)制代碼 代碼如下:
<?php
$contents = file_get_contents('http://www.fzitv.net/');
?>
當(dāng)被污染數(shù)據(jù)用于include和require的文件指向時(shí),會(huì)產(chǎn)生嚴(yán)重漏洞。實(shí)際上,我認(rèn)為這種漏洞是PHP應(yīng)用中最危險(xiǎn)的漏洞之一,這是因?yàn)樗试S攻擊者執(zhí)行任意代碼。盡管嚴(yán)重性在級(jí)別上要差一點(diǎn),但在一個(gè)標(biāo)準(zhǔn)文件系統(tǒng)函數(shù)中使用了被污染數(shù)據(jù)的話,會(huì)有類似的漏洞產(chǎn)生:
復(fù)制代碼 代碼如下:
<?php
$contents = file_get_contents($_GET['filename']);
?>
該例使用戶能操縱file_get_contents( )的行為,以使它獲取遠(yuǎn)程資源的內(nèi)容。考慮一下類似下面的請(qǐng)求:
http://example.org/file.php?file ... mple.org%2Fxss.html
這就導(dǎo)致了$content的值被污染的情形,由于這個(gè)值是通過間接方式得到的,因此很可能會(huì)忽視這個(gè)事實(shí)。這也是深度防范原則會(huì)視文件系統(tǒng)為遠(yuǎn)程的數(shù)據(jù)源,同時(shí)會(huì)視$content的值為輸入,這樣你的過濾機(jī)制會(huì)潛在的起到扭轉(zhuǎn)乾坤的作用。
由于$content值是被污染的,它可能導(dǎo)致多種安全漏洞,包括跨站腳本漏洞和SQL注入漏洞。例如,下面是跨站腳本漏洞的示例:
復(fù)制代碼 代碼如下:
<?php
$contents = file_get_contents($_GET['filename']);
echo $contents;
?>
解決方案是永遠(yuǎn)不要用被污染的數(shù)據(jù)去指向一個(gè)文件名。要堅(jiān)持過濾輸入,同時(shí)確信在數(shù)據(jù)指向一個(gè)文件名之前被過濾即可:
復(fù)制代碼 代碼如下:
<?php
$clean = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
?>
盡管無法保證$content中的數(shù)據(jù)完全沒有問題,但這還是給出了一個(gè)合理的保證,即你讀取的文件正是你想要讀取的文件,而不是由攻擊者指定的。為加強(qiáng)這個(gè)流程的安全性,你同樣需要把$content看成是輸入,并在使用前對(duì)它進(jìn)行過濾。
復(fù)制代碼 代碼如下:
<?php
$clean = array();
$html = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
/* Filter Input ($contents) */
$html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8');
echo $html['contents'];
?>
上面的流程提供了防范多種攻擊的強(qiáng)有力的方法,同時(shí)在實(shí)際編程中推薦使用。
您可能感興趣的文章:
- php下載遠(yuǎn)程文件類(支持?jǐn)帱c(diǎn)續(xù)傳)
- PHP 遠(yuǎn)程文件管理,可以給表格排序,遍歷目錄,時(shí)間排序
- 獲取遠(yuǎn)程文件大小的php函數(shù)
- PHP 獲取遠(yuǎn)程文件內(nèi)容的函數(shù)代碼
- PHP 網(wǎng)絡(luò)開發(fā)詳解之遠(yuǎn)程文件包含漏洞
- php帶密碼功能并下載遠(yuǎn)程文件保存本地指定目錄 修改加強(qiáng)版
- php下利用curl判斷遠(yuǎn)程文件是否存在的實(shí)現(xiàn)代碼
- PHP讀取文件并可支持遠(yuǎn)程文件的代碼分享
- PHP 獲取遠(yuǎn)程文件大小的3種解決方法
- php實(shí)現(xiàn)按文件名搜索文件的遠(yuǎn)程文件查找器
- PHP實(shí)現(xiàn)的一個(gè)保存遠(yuǎn)程文件到本地的函數(shù)分享
- PHP下載遠(yuǎn)程文件到本地存儲(chǔ)的方法
- php獲取遠(yuǎn)程文件大小
相關(guān)文章
PHP文字轉(zhuǎn)圖片功能原理與實(shí)現(xiàn)方法分析
這篇文章主要介紹了PHP文字轉(zhuǎn)圖片功能原理與實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了php基于gd2擴(kuò)展庫(kù)生成圖片的相關(guān)配置及使用方法,需要的朋友可以參考下2017-08-08
php安全開發(fā) 添加隨機(jī)字符串驗(yàn)證,防止偽造跨站請(qǐng)求
偽造跨站請(qǐng)求比較難以防范,而且危害巨大,攻擊者可以通過這種方式惡作劇,發(fā)spam信息,刪除數(shù)據(jù)等等。那怎么防范偽造跨站攻擊呢2013-02-02
PHP實(shí)現(xiàn)負(fù)載均衡session共享redis緩存操作示例
這篇文章主要介紹了PHP實(shí)現(xiàn)負(fù)載均衡session共享redis緩存操作,涉及php用戶登陸、session存儲(chǔ)、判斷等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
PHP封裝的微信公眾平臺(tái)接口開發(fā)操作類完整示例
這篇文章主要介紹了PHP封裝的微信公眾平臺(tái)接口開發(fā)操作類,結(jié)合完整實(shí)例形式分析了php微信開發(fā)所涉及的配置、驗(yàn)證、接收、響應(yīng)、文本、語(yǔ)音、圖片等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
PHP中經(jīng)緯度坐標(biāo)相關(guān)計(jì)算方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了PHP中經(jīng)緯度坐標(biāo)相關(guān)計(jì)算方法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04

