


PHP最主要的7個(gè)安全漏洞
對(duì)于快速發(fā)展的動(dòng)態(tài)網(wǎng)頁(yè)而言,PHP是一種了不起的語(yǔ)言。PHP也具有對(duì)初級(jí)程序員友好的特點(diǎn),比如PHP就不需要?jiǎng)討B(tài)聲明。然而,這些特征可能導(dǎo)致一個(gè)程序員無(wú)意地讓安全漏洞潛入到web應(yīng)用程序中。在PHP應(yīng)用中,流行的安全郵件列表就出現(xiàn)大量被證實(shí)的漏洞,但是一旦你明白PHP應(yīng)用程序中常見(jiàn)的幾種漏洞的基本類型,那你將發(fā)現(xiàn)它和其他語(yǔ)言是同樣安全的。
在這篇文章中,我將詳細(xì)地介紹會(huì)導(dǎo)致安全漏洞的幾種常用見(jiàn)的PHP程序缺陷。通過(guò)向你們展示什么是不能做的,并且如何利用每個(gè)特定的缺陷,我希望你們不僅僅能明白怎樣避免這些特定的缺陷,而且為什么這些錯(cuò)誤能導(dǎo)致安全漏洞。
明白每個(gè)可能出現(xiàn)的缺陷,將幫助你們避免在PHP應(yīng)用程序中產(chǎn)生同樣的錯(cuò)誤。
安全是一個(gè)過(guò)程,不是一個(gè)產(chǎn)品在應(yīng)用程序開(kāi)發(fā)過(guò)程中采用對(duì)安全有益的方法可以讓你生成更緊密,更健壯的代碼。
未校驗(yàn)輸入缺陷
如果不是最常見(jiàn)的PHP安全漏洞,也是其中之一的,就是未校驗(yàn)輸入錯(cuò)誤。提供數(shù)據(jù)的用戶是根本不能信任的。你應(yīng)該假定你的web應(yīng)用程序的用戶個(gè)個(gè)都是心懷叵測(cè)的,因?yàn)樗麄冎械囊恍┚褪悄菢拥摹N葱r?yàn)或不正確驗(yàn)證輸入是被一些漏洞所利用的根源,我們將在本文后面進(jìn)行討論。
例如,你可能寫一個(gè)允許用戶查看日歷的如下代碼,通過(guò)調(diào)用UNIX的cal命令來(lái)顯示指定月份。
$month = $_GET['month'];
$year = $_GET['year'];
exec("cal $month $year", $result);
print "
";
foreach ($result as $r) { print "$r"; }
print "";
此代碼具有一個(gè)安全漏洞縫隙,因?yàn)闆](méi)有以任何的方式來(lái)驗(yàn)證$_GET[month]和$_GET[year]變量。只要那個(gè)特定的月份是在1到12之間,并且提供一個(gè)合適的四位數(shù)年份,那這個(gè)應(yīng)用程序?qū)⑼昝肋\(yùn)行。然而,惡意用戶可能追加“; ls - la”到年參數(shù),從而看到您網(wǎng)站的HTML目錄列表。一個(gè)極端惡劣的用戶可能追加";rm -rf *"到年參數(shù),且刪除整個(gè)網(wǎng)站!
糾正這種錯(cuò)誤的合適的方法就是確保你從用戶接受的輸入是你期望得到的。不用為這種錯(cuò)誤使用Java驗(yàn)證,創(chuàng)造他們自己形式j(luò)ava或是禁用java的開(kāi)發(fā)者是很容易處理如此的驗(yàn)證方法的。為確保輸入月份和年份是數(shù)字,且只有數(shù)字,你需要添加PHP代碼,如下所示。
$month = $_GET['month'];
$year = $_GET['year'];
if (!preg_match("/^[0-9]{1,2}$/", $month)) die("Bad month, please re-enter.");
if (!preg_match("/^[0-9]{4}$/", $year)) die("Bad year, please re-enter.");
exec("cal $month $year", $result);
print "
";
foreach ($result as $r) { print "$r"; }
print "";
不用擔(dān)心用戶提供影響你應(yīng)用程序的輸入或是運(yùn)行輸入的服務(wù)器,你能安全地使用代碼。正則表達(dá)式是一個(gè)很棒的驗(yàn)證輸入的工具。盡管難以掌握它,但在這種情況下是非常有用的。
你應(yīng)該總是通過(guò)拒絕與你期望數(shù)據(jù)不相符合的數(shù)據(jù),來(lái)驗(yàn)證你的用戶提供的數(shù)據(jù)。永遠(yuǎn)都不要使用在你知道期望數(shù)據(jù)是有害的情況下仍然接受此數(shù)據(jù)的方法,此方法是安全漏洞的共同來(lái)源。有時(shí),惡意的用戶能避開(kāi)此種方法,例如,用空字符來(lái)掩蓋壞輸入的方法。如此的輸入將通過(guò)檢查,但是它仍然具有壞的影響。
當(dāng)你驗(yàn)證任何輸入時(shí),你應(yīng)當(dāng)盡可能的嚴(yán)格。如果有一些沒(méi)必要包含的字符,可能的話,你應(yīng)該要么去除那些無(wú)用的字符,要么完全拒絕輸入。
訪問(wèn)控制缺陷
另一個(gè)缺陷,不一定限于PHP應(yīng)用程序,但仍然是重要的,是訪問(wèn)控制的脆弱性類型。當(dāng)你的應(yīng)用程序的某些部分的應(yīng)用是限定于某些用戶的時(shí)候,這種缺陷就出現(xiàn)了,如,一個(gè)允許更改配置設(shè)置或顯示敏感信息的管理頁(yè)面。
你應(yīng)該檢查每個(gè)你的PHP應(yīng)用程序頁(yè)面限制加載的用戶的訪問(wèn)權(quán)利。如果你僅僅只檢查在索引頁(yè)面的用戶證書,那么一個(gè)惡意的用戶能直接進(jìn)入一個(gè)“更深層”網(wǎng)頁(yè)的鏈接,這將跳過(guò)證書檢查的過(guò)程。
如,如果你的網(wǎng)站有攻擊用戶的可預(yù)測(cè)IP或固定IP地址,則可以通過(guò)限制用戶訪問(wèn)該用戶的基本IP地址和他們用戶的名字在你程序的安全層上是有利的。放置你的受限制的網(wǎng)頁(yè)在一個(gè)由apache.htaccess文件保護(hù)的獨(dú)立的目錄里也是一個(gè)好的做法。
將配置文件放置在你web訪問(wèn)目錄的外面。一個(gè)配置文件包含數(shù)據(jù)庫(kù)密碼和其他一些能被惡意用戶用來(lái)滲透或者破壞你站點(diǎn)的信息;從來(lái)不讓遠(yuǎn)程用戶訪問(wèn)這些文件。使用PHP的include函數(shù)來(lái)包含這些來(lái)自不可web訪問(wèn)的目錄的文件,萬(wàn)一這個(gè)目錄曾因管理員誤操作而產(chǎn)生web訪問(wèn),這可能包括含有“否定一切”的an.htaccess文件。盡管分層安全是多余的,但是它是一件積極的事情。
關(guān)健詞:PHP
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解