西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)西西教程數(shù)據(jù)庫(kù)教程 → 預(yù)防查詢語(yǔ)句數(shù)據(jù)庫(kù)注入漏洞攻擊

預(yù)防查詢語(yǔ)句數(shù)據(jù)庫(kù)注入漏洞攻擊

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/9/25 8:42:23字體大小:A-A+

作者:西西點(diǎn)擊:42次評(píng)論:0次標(biāo)簽: 數(shù)據(jù)庫(kù)注入

  • 類型:編程控件大。5.9M語(yǔ)言:中文 評(píng)分:7.5
  • 標(biāo)簽:
立即下載

簡(jiǎn)單地說(shuō),Sql注入就是將Sql代碼傳遞到應(yīng)用程序的過(guò)程,但不是按照應(yīng)用程序開發(fā)人員預(yù)定或期望的方式插入,相當(dāng)大一部分程序員在編寫代碼的時(shí)候,并沒(méi)有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患。這種漏洞并非系統(tǒng)照成,而是由程序員在編程中忽略了安全因素。Sql注入漏洞攻擊原理就是利用非法參數(shù)獲得敏感信息,收集整理,分析出管理員賬號(hào)密碼。

當(dāng)開發(fā)應(yīng)用程序時(shí),尤其是有關(guān)數(shù)據(jù)庫(kù)信息的查詢,查詢語(yǔ)句中可能會(huì)有拼接字符串注入漏洞,這便會(huì)導(dǎo)致用戶資料泄露。那么該如何防范此類漏洞的出現(xiàn)。

可以為查詢語(yǔ)句設(shè)置參數(shù),方法實(shí)例如下面所示

Using(Sqlconnection cn = new sqlconnection(“連接字符串”))

{

cn.open();

using(sqlcommand cmd = cn.creatcommand())

{

cmd.commandtext=”select * from T_table where name=’”+textbox.text+”’”;

(此時(shí)如果在文本框中輸入1’ or ‘1’=’1)就可以獲取數(shù)據(jù)庫(kù)信息。會(huì)造成信息的泄露。解決辦法就是引入?yún)?shù)。方法如下。

cmd.commandtext=”select * from T_table where name=@Name”;

cmd.Parameters.Add (new sqlParameter ("@Name", textbox.text))};

這樣查詢數(shù)據(jù)就會(huì)從數(shù)據(jù)庫(kù)查詢比對(duì),不會(huì)再出現(xiàn)注入漏洞攻擊的情況。

}

}

每一次必不可少的會(huì)寫對(duì)數(shù)據(jù)庫(kù)操作的Sql語(yǔ)句,例如以下驗(yàn)證登陸的Sql語(yǔ)句:

string strSql="select * from Table Where UserName='"+textBoxUserName.Text+'"and UserPassord='"+textBoxPassword.Text+"'";
或者
string strSql=string.Format("select * from Table where UserName='{0}' and UserPassword='{1}'",textBoxUserName.Text,textBoxPassword.Text);
在上面的語(yǔ)句中,對(duì)數(shù)據(jù)庫(kù)操作的Sql語(yǔ)句使用字符串拼接的方式寫的,這種方式是前期的程序員以及初學(xué)者通用的對(duì)數(shù)據(jù)庫(kù)操作的一種Sql語(yǔ)句寫法,上述代碼中的textBoxUserName是用戶在textBoxUserName文本框中提交的用戶名,textUserpassword是用戶在textUserpassword文本框中提交的密碼,在理想的狀態(tài)下,用戶 為了對(duì)系統(tǒng)進(jìn)行攻擊,用戶(就是黑客)可能嘗試篡改Sql語(yǔ)句,達(dá)到登錄的目的。例如用戶可能在用戶名文本框中輸入下面的語(yǔ)句:
1' or 1=1 --

下面我們把上面一行的語(yǔ)句代入到前面用于登錄的Sql語(yǔ)句中,得到下面的Sql語(yǔ)句:
select * from Table where UserId='1' or 1=1 --'and UserName=' '
稍微學(xué)過(guò)數(shù)據(jù)庫(kù)Sql語(yǔ)句的,很快就會(huì)發(fā)現(xiàn)上面一句話的不正常,這條Sql語(yǔ)句會(huì)返回Table表的全部數(shù)據(jù),這就是黑客有機(jī)可乘的地方,黑客可以用這種方法成功登陸,還可以獲取該Table表的所有信息。下面解釋一下這句Sql語(yǔ)句:如果只有select * from Table,就會(huì)返回該Table表的所有信息,where后是查詢條件,1=1永遠(yuǎn)為True,不管User='1'為True還是為False,UserId='1' or 1=1 都為True。至于--'and UserName=' ' ,因?yàn)閮蓚(gè)連字符(--)是MS Sql Server的注釋標(biāo)記(My Sql和Oracle數(shù)據(jù)庫(kù)也使用相同的技術(shù),不過(guò)My Sql使用的注釋標(biāo)記師是符號(hào)#,Oracle使用的是分號(hào);),--后面的內(nèi)容傳到數(shù)據(jù)庫(kù)查詢時(shí)都被注釋了,那么--后面的內(nèi)容就沒(méi)用了,Sql語(yǔ)句不會(huì)執(zhí)行了,所以where后的查詢條件永遠(yuǎn)為True,綜上所述,上面的Sql查詢語(yǔ)句會(huì)返回Table表的所有信息!

通過(guò)這種Sql語(yǔ)法漏洞,黑客們可以達(dá)到他們的目的,但Sql注入漏洞攻擊絕對(duì)不止這一種,復(fù)雜的還有很多,我不在說(shuō)了。下面我談一下我知道在.NET中應(yīng)對(duì)上面這種Sql注入攻擊的防范措施。
我們所能做的,如果不修改上面的Sql查詢語(yǔ)句,那一種方法就是利用TextBox控件的MaxLength屬性,這樣就鍵入了黑客鍵入字符的數(shù)量,從而可以限制黑客向服務(wù)器發(fā)送大量的非法命令,但這種方法只是掩耳盜鈴,治不了根本。第二種方法就是刪除用戶輸入中的單引號(hào),方法是在單引號(hào)后面加一個(gè)或多個(gè)單引號(hào),或者利用空格替換單引號(hào),這樣就可以預(yù)防此類攻擊。但局限性是如果用戶的用戶名或密碼中就含有單引號(hào)呢,那就不可行了!

最完美的一種方法就是使用ADO.NET Command對(duì)象的參數(shù)集合,在前面的可以進(jìn)行Sql注入漏洞攻擊的Sql語(yǔ)句中,通過(guò)使用字符串拼接方法動(dòng)態(tài)創(chuàng)建查詢,在這里我們可以利用ADO.NET Command的對(duì)象的Parameters屬性提供的功能,傳遞執(zhí)行Sql語(yǔ)句所使用的參數(shù),在這種方法中參數(shù)名必須以字符@為前綴,例如以下Sql查詢語(yǔ)句:
string strSql="select * from Table where UserName=@UserName and UserPassword=@UserPassword";
在該語(yǔ)句中,@UserName和@UserPassword就是參數(shù)名,可以使用以下語(yǔ)句為該參數(shù)傳值:
SqlCommand cmd=new SqlCommand(strSql,conn);
SqlParameters[] pams=new SqlParameters(new SqlParameters("@UserName",textBoxUserName.Text),new SqlParameters("@UserPassword",textBoxPassword.Text));
cmd.Parameters.AddRange(pams);
參數(shù)名不區(qū)分大小寫,這種方法也適宜存儲(chǔ)過(guò)程和SqlDataAdapter對(duì)象。

我們?cè)趧?dòng)態(tài)創(chuàng)建Sql語(yǔ)句中使用了@UserName和@UserPassword名稱,而不是拼接多個(gè)字符串,這樣就可以使用SqlCommand對(duì)象的Parameters集合傳遞值,該方法可以安全的創(chuàng)建動(dòng)態(tài)Sql連接。參數(shù)在Sql Server內(nèi)部不是簡(jiǎn)單的字符串替換,Sql Server直接0用添加的值進(jìn)行數(shù)據(jù)比較,因此不會(huì)有Sql注入漏洞攻擊。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)