PHP安全-遠(yuǎn)程文件風(fēng)險(xiǎn)
PHP有一個(gè)配置選項(xiàng)叫allow_url_fopen,該選項(xiàng)默認(rèn)是有效的。它允許你指向許多類型的資源,并像本地文件一樣處理。例如,通過(guò)讀取URL你可以取得某一個(gè)頁(yè)面的內(nèi)容(HTML):
<?php
$contents = file_get_contents(’http://example.org/’);
?>
正如第五章所討論的那樣,當(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è)值是通過(guò)間接方式得到的,因此很可能會(huì)忽視這個(gè)事實(shí)。這也是深度防范原則會(huì)視文件系統(tǒng)為遠(yuǎn)程的數(shù)據(jù)源,同時(shí)會(huì)視$content的值為輸入,這樣你的過(guò)濾機(jī)制會(huì)潛在的起到扭轉(zhuǎn)乾坤的作用。
由于$content值是被污染 的,它可能導(dǎo)致多種安全漏洞,包括跨站腳本漏洞和SQL注入漏洞。例如,下面是跨站腳本漏洞的示例:
<?php
$contents = file_get_contents($_GET[’filename’]);
echo $contents;
?>
解決方案是永遠(yuǎn)不要用被污染的數(shù)據(jù)去指向一個(gè)文件名。要堅(jiān)持過(guò)濾輸入,同時(shí)確信在數(shù)據(jù)指向一個(gè)文件名之前被過(guò)濾即可:
<?php
$clean = array();
/* Filter Input ($_GET[’filename’]) */
$contents = file_get_contents($clean[’filename’]);
?>
盡管無(wú)法保證$content中的數(shù)據(jù)完全沒(méi)有問(wèn)題,但這還是給出了一個(gè)合理的保證,即你讀取的文件正是你想要讀取的文件,而不是由攻擊者指定的。為加強(qiáng)這個(gè)流程的安全性,你同樣需要把$content看成是輸入,并在使用前對(duì)它進(jìn)行過(guò)濾。
<?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í)際編程中推薦使用。
相關(guān)文章:
1. AJAX實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)效果2. Java通俗易懂系列設(shè)計(jì)模式之模板模式3. 如何用python識(shí)別滑塊驗(yàn)證碼中的缺口4. 快速解決ajax返回值給外部函數(shù)的問(wèn)題5. Java基于redis和mysql實(shí)現(xiàn)簡(jiǎn)單的秒殺(附demo)6. Kotlin + Flow 實(shí)現(xiàn)Android 應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)7. IDEA SpringBoot 項(xiàng)目配置Swagger2的詳細(xì)教程8. SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine)9. php讀取xml中某個(gè)元素的內(nèi)容(PHP5以上才支持)10. ASP.NET MVC視圖頁(yè)使用jQuery傳遞異步數(shù)據(jù)的幾種方式詳解
