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