目前PHP因其功能強大、入門簡單、代碼執(zhí)行效率高等優(yōu)點,成為了Web應(yīng)用開發(fā)的流行語言。由于使用廣泛,所以利用PHP安全漏洞對Web網(wǎng)站進行的攻擊也越來越多,這給Web應(yīng)用的安全帶來了嚴重威脅。對網(wǎng)站的安全負有直接責(zé)任的主要有兩類人員:一類是網(wǎng)站開發(fā)人員;一類是網(wǎng)站管理人員。本文筆者就從網(wǎng)站開發(fā)的角度,對PHP安全漏洞的防范進行了較為全面的總結(jié)、研究。
對以往大量攻擊案例的研究表明,PHP安全漏洞的產(chǎn)生原因主要是沒有對用戶的輸人進行嚴格的驗證和對系統(tǒng)的輸出沒有進行適當(dāng)?shù)霓D(zhuǎn)義。用戶的輸入永遠是不可以盲目相信的,在沒有進行驗證前,都可以認為是被污染數(shù)據(jù)。系統(tǒng)的愉出在沒有適當(dāng)轉(zhuǎn)義前,也有可能帶來較大的安全風(fēng)險。
1、未對用戶輸入進行嚴格驗證產(chǎn)生安全漏洞及其防范
考慮一個系統(tǒng)的登錄驗證,此系統(tǒng)要求用注冊時所填的郵箱和密碼登錄。一般情況下,只要輸入正確即可登錄,如果輸人錯誤則不允許登錄,這是通常的處理流程。其程序?qū)崿F(xiàn)一般是,通過一個登錄表單獲取用戶輸入的郵箱和密碼,然后傳遞給程序以構(gòu)造一個SQL查詢語句,例如:select count(*)from users where email='myemail@163.com'and password='mypass',再將此SQL語句提交給后臺數(shù)據(jù)庫執(zhí)行,若返回的記錄數(shù)為0,則說明輸人的郵箱信息或密碼有誤或用戶根本沒有注冊,系統(tǒng)拒絕其登錄,反之則為合法用戶,允許其登錄。這套驗證流程對于一般的客戶是十分奏效的,其若沒有注冊亦或沒有袖人正確的郵箱和密碼都是不能登錄系統(tǒng)的。但對于黑客來說,情況就不一樣了。其完全可以精心設(shè)計一個字符串來代替合法郵箱地址從而繞過系統(tǒng)的驗證,例如:若黑客輸人的郵箱地址是“myemail"orI=I--"、密碼是"myppass",此時SQL語句變?yōu)閟elect count(*)from users wherer email='myemail' or I=I--" and password='mypass' ,此語句執(zhí)行后所返回的記錄數(shù)是users表的所有記錄總數(shù),并不為0,所以通過了系統(tǒng)的登錄驗證,系統(tǒng)允許其登錄。這就是著名的SQL注入攻擊。導(dǎo)致這個后果的原因是黑客精心構(gòu)造了一個字符串用于代替合法郵箱地址且系統(tǒng)并未對用戶輸入的數(shù)據(jù)本身進行合法性檢查。
為了對上述PHP安全漏洞進行防范,我們可以對用戶的輸人進行合法性驗證。此處要求入的是郵箱地址,為了對用戶輸入的數(shù)據(jù)本身進行合法性檢查,我們可以用正則表達式對用戶輸人的郵箱地址進行驗證,看是否符合正確的郵箱格式,這樣就可以大大增加黑客設(shè)計特殊字符串的難度,在一定程度上防止SQL注人漏洞的產(chǎn)生。
在任何悄況下,如果對用戶的輸人均進行嚴格的驗證,當(dāng)然,驗證方法根據(jù)不同情況而有所不同,并不局限于正則表達式,這就可以在很大程度上對PHP安全漏洞進行防范。
2、未對系統(tǒng)的輸出進行適當(dāng)轉(zhuǎn)義產(chǎn)生安全漏洞及其防范
未對系統(tǒng)的輸出進行適當(dāng)轉(zhuǎn)義也會產(chǎn)生安全漏洞,跨站腳本漏洞就是一個很著名的例子。假設(shè)有一個可以發(fā)表評論的系統(tǒng),其采用表單的形式進行數(shù)據(jù)提交。對于一般用戶,這不會有什么太大間題,但是對于黑客,問題就來了。因為黑客并不是真的想發(fā)表什么評論,其有可能是想盜取其他登錄用戶的cookies。為了盜取其他錄用戶的cookies, 黑可以將javascript代碼作為評論內(nèi)容進行提交。
如果在輸出前對黑客所提交的內(nèi)容不做任何轉(zhuǎn)義的話,那么lavascript代碼將被其他用戶的瀏覽器所執(zhí)行,從而將瀏覽評論的其他登錄用戶的cookies信息發(fā)送到黑客手上。為了防范上述跨站腳本漏洞攻擊,我們所要采取的措施很簡單:在將評論內(nèi)容輸出到客戶端瀏覽器之前,利用htmlentities()函數(shù)對輸出內(nèi)容進行轉(zhuǎn)義。此函數(shù)可以將輸出內(nèi)容當(dāng)中可能包含的html標簽轉(zhuǎn)換成html實體,從而使得黑客輸入的Javascript代碼不被執(zhí)行。
任何情況下,對于系統(tǒng)的輸出都應(yīng)該進行適當(dāng)?shù)霓D(zhuǎn)義(轉(zhuǎn)義方法根據(jù)不同情況而有所不同,并不局限于htmlentities()函數(shù)),這樣才不會讓黑客有機可乘。
聲明:本文由鄭州批發(fā)市場: 原創(chuàng)投稿,尊重他人成果,轉(zhuǎn)載請注明出處!
申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!