作為一個網(wǎng)站站長,尤其是新站站長,有時候為了修改網(wǎng)站的功能、添加網(wǎng)站的特色,就不得不自己寫一些代碼。在這個過程中,若出現(xiàn)一點錯誤,可能就會給網(wǎng)站帶災(zāi)難性安全危機(jī)。即使網(wǎng)站原本是由專業(yè)開發(fā)團(tuán)隊開發(fā)上線的,有較好的安全性,但是在木桶原理的作用下,你添加的那幾行錯誤代碼,完全可以導(dǎo)致整個網(wǎng)站的安全機(jī)制土崩瓦解。 現(xiàn)在將EeSafe網(wǎng)站安全聯(lián)盟列出幾點使用php架構(gòu)的網(wǎng)站常出現(xiàn)的代碼級安全問題,希望對站長的修改代碼工作有一定的幫助。大家有什么疑問,可以到EeSafe網(wǎng)絡(luò)安全中心交流,EeSafe期待和大家共同進(jìn)步 1.現(xiàn)在最常見的php代碼編寫上的安全問題 Php全局變量危害代碼:
很明顯,這是判斷登陸的是否是管理員,很多網(wǎng)站也用這個邏輯判斷其他重要的條件。 看上去這段代碼很正確,但其實有個致命的錯誤,它假定$isadmin在沒賦值的時候是空值,但由于php語言為了使php代碼訪問用戶的輸入盡可能容易,php把輸入數(shù)據(jù)作為全局變量來處理。所以攻擊者可以創(chuàng)建任意全局變量并賦值。 如何避免這樣最容易被會略的問題,如果你網(wǎng)站使用的是PHP程序開發(fā),如果你已經(jīng)這樣做了,并且web應(yīng)用程序變量很多的話,最節(jié)省效率的辦法就是修改php的track_vars選項。 2.網(wǎng)站雙條件認(rèn)證安全問題 判斷用戶名和密碼,先判斷是否為空,然后從數(shù)據(jù)數(shù)據(jù)庫找同時符合條件的數(shù)據(jù)。 如果采用這樣的邏輯將直接導(dǎo)致sql注入。 如果你要增加或修改這樣的功能,程序邏輯應(yīng)該是:首先,找到數(shù)據(jù)庫中用戶名符合的數(shù)據(jù)(當(dāng)然用戶名在數(shù)據(jù)庫中必須是唯一的),然后查看這條數(shù)據(jù)中對應(yīng)的密碼是否和要驗證的密碼相同,這樣就避免雙認(rèn)證問題。 3.用用戶名去判斷用戶權(quán)限 很多網(wǎng)站都有這樣的問題,比如
看上去這個也沒有邏輯問題,但為什么還是存在安全漏洞?是因為很多數(shù)據(jù)庫對特殊字符都不處理,比如mysql這樣的數(shù)據(jù)庫,如果輸入的字符在ASCII碼129~255范圍內(nèi),是不做處理的,也就是如果注冊用戶使用“admin+特殊字符”時,他也同樣能夠成功注冊一個名為admin的用戶,安全機(jī)制消失了。歡迎交流探討。 EeSafe網(wǎng)站安全聯(lián)盟原創(chuàng)文章 轉(zhuǎn)載請以鏈接形式注明原文地址:http://www.eesafe.com/bbs/thread-1309-1-1.html |