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