之所以舊事重提,只是想給那些還沒接觸到的人提個(gè)醒,順便聽聽眾位高手們的看法,好學(xué)習(xí)學(xué)習(xí)。
我們?cè)诰幊踢^程中,經(jīng)常會(huì)把用戶輸入的數(shù)據(jù)拼成一個(gè)SQL語句,然后直接發(fā)送給服務(wù)器執(zhí)行,比如:
string SqlStr = "select * from customers where CompanyName Like '%" + textBox1.Text + "%'";
這樣的字符串連接可能會(huì)帶來災(zāi)難性的結(jié)果,比如用戶在文本框中輸入:
a' or 1=1 --
那么SqlStr的內(nèi)容就是:
select * from customers where CompanyName like '%a' or 1=1 --%'
這樣,整個(gè)customers數(shù)據(jù)表的所有數(shù)據(jù)就會(huì)被全部檢索出來,因?yàn)?=1永遠(yuǎn)true,而且最后的百分號(hào)和單引號(hào)被短橫杠注釋掉了。
如果用戶在文本框中輸入:
a' EXEC sp_addlogin 'John' ,'123' EXEC sp_addsrvrolemember 'John','sysadmin' --
那么SqlStr的內(nèi)容就是:
select * from customers where CompanyName like '%a' EXEC sp_addlogin 'John','123' EXEC sp_addsrvrolemember 'John','sysadmin' --
這個(gè)語句是在后臺(tái)數(shù)據(jù)庫中增加一個(gè)用戶John,密碼123,而且是一個(gè)sysadmin賬號(hào),相當(dāng)于sa的權(quán)限。
如果用戶在文本框中輸入:
a' EXEC xp_cmdShell('format c:/y') --
運(yùn)行之后好像是格式化C盤!
還有很多更危險(xiǎn)的操作,不過都沒試過。還是存儲(chǔ)過程好用啊,存儲(chǔ)過程的參數(shù)把用戶的輸入當(dāng)成真正的字符串處理,既安全,又快速!
文章出處:http://maxianghui.cnblogs.com/archive/2006/07/12/448978.html
新聞熱點(diǎn)
疑難解答
圖片精選