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