Sql語句密碼驗證的安全漏洞
導(dǎo)讀:Sql語句作為國際標(biāo)準(zhǔn)的數(shù)據(jù)庫查詢語句,在各種編程環(huán)境中得到了廣泛的應(yīng)用。作為一個成熟、穩(wěn)定的系統(tǒng),用戶登陸和密碼驗證是必不可少的。筆者在平時的編程工作中發(fā)現(xiàn),許多程序員在用sql語句進行用戶密碼驗證時是通過一個類似這樣的語句來實現(xiàn)的:
Sql="Select * from 用戶表 where 姓名='"+name+"' and 密碼='"+password+"'"
其中name和password是存放用戶輸入的用戶名和口令,通過執(zhí)行上述語句來驗證用戶和密碼是否合法有效。但是通過分析可以發(fā)現(xiàn),上述語句卻存在著致命的漏洞。當(dāng)我們在用戶名稱中輸入下面的字符串時:111'or'1=1,然后口令隨便輸入,我們設(shè)為aaaa。變量代換后,sql語句就變成了下面的字符串:
Sql="Select * from 用戶表 where 姓名='111'or'1=1' and 密碼='aaaa'
我們都知道select語句在判斷查詢條件時,遇到或(or)操作就會忽略下面的與(and)操作,而在上面的語句中1=1的值永遠為true,這意味著無論在密碼中輸入什么值,均能通過上述的密碼驗證!這個問題的解決很簡單,方法也很多,最常用的是在執(zhí)行驗證之前,對用戶輸入的用戶和密碼進行合法性判斷,不允許輸入單引號、等號等特殊字符。
上述問題雖然看起來簡單,但確實是存在的。例如在互聯(lián)網(wǎng)上很有名氣的網(wǎng)絡(luò)游戲"笑傲江湖"的早期版本就存在著這樣的問題,筆者也是在看了有關(guān)此游戲的漏洞報告后才仔細分析了自己以前編寫的一些程序,竟然有不少也存在著這樣的漏洞。這確實應(yīng)該引起我們的注意。這也暴露出包括筆者在內(nèi)的年輕程序員在編程經(jīng)驗和安全意識上的不足。同時也提醒我們編程工作者在程序設(shè)計時應(yīng)當(dāng)充分考慮程序的安全性,不可有半點馬虎,一個看似很小的疏漏可能就會造成很嚴(yán)重的后果。所以在進行數(shù)據(jù)庫操作時一定要特別的謹(jǐn)慎,至于Sql語句 密碼驗證存在的安全漏洞要盡量去克服,以確保數(shù)據(jù)庫安全。
【編輯推薦】