摘 要:分析SQL注入式攻擊,提出防范SQL注入式攻擊的方法。
關(guān)鍵詞:SQL注入攻擊;ASP.net
中圖分類號(hào):TP文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1672-3198(2008)10-0354-01
SQL注入式攻擊是指利用程序設(shè)計(jì)上的漏洞,在目標(biāo)服務(wù)器上運(yùn)行SQL命令以及其他命令的攻擊,動(dòng)態(tài)生成SQL命令時(shí)沒(méi)有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行驗(yàn)證,是SQL注入攻擊得逞的主要原因。
例如,如果用戶的查詢語(yǔ)句是select count(*) from tab_userwhere name=' \" user \" 'and password = ' \" pwd \" ' ,那么,如果name字段的值為1'or'1'='1 ,則查詢語(yǔ)句將會(huì)變成:
Select count(*) from tab_user where name='1' or '1' = '1' and password = ' \" pwd \" '。
以上輸入經(jīng)系統(tǒng)核對(duì)無(wú)誤運(yùn)行后,注入者將通過(guò)驗(yàn)證,進(jìn)入程序管理界面,從而獲得軟件的管理權(quán)限,對(duì)系統(tǒng)安全造成一定程度的威脅。由此可見,防范SQL注入式攻擊對(duì)于系統(tǒng)安全有著至關(guān)重要的作用。
防范SQL注入式攻擊的方法之一是,對(duì)用戶輸入的信息進(jìn)行檢查。特別是一些特別字符,比如單引號(hào)、雙引號(hào)、分號(hào)、逗號(hào)、冒號(hào)和連接號(hào)等。對(duì)這些字符進(jìn)行轉(zhuǎn)換或者過(guò)濾,可有效防止攻擊的發(fā)生。
在Asp.net代碼中使用如下子程序可有效過(guò)濾特殊字符及字符串:
///inputString為用戶輸入需過(guò)濾的字符串
Public string ConvertSql(string inputString)
{
inputString = inputString.Trim();
inputString = inputString.Replace(\"' \", \" \" \");
inputString = inputString.Replace(\";—— \", \" \");
inputString = inputString.Replace(\"=\", \" \");
inputString = inputString.Replace(\"or\", \" \");
inputString = inputString.Replace(\"and\", \" \");
return inputString;
}
以上代碼在ASP.net中并非最有效的防范手段,最佳方法是通過(guò)SqlCommand.Parameters屬性的參數(shù)傳值方法實(shí)現(xiàn)防范,這樣一來(lái)可以通過(guò)參數(shù)將非法字符過(guò)濾掉。代碼如下:
Public int checkLogin(string namevalue,string pwdvalue)
{
SqlConnection conn = new SqlConnection(ConfigurationManager. AppSettings[\"connstr\"]);
///從web.config中讀出connstr對(duì)應(yīng)的鍵值;
SqlCommand cmd= new SqlCommand(\"select count(*) from tab_user where name=@name_param and password=@pwd_param \" ,conn);
///動(dòng)態(tài)創(chuàng)建SQL語(yǔ)句,其中聲明兩個(gè)參數(shù)name_param和pwd_param;
cmd.Parameters.Add(new SqlParameter(\"@name_param\",SqlDbType.NVarChar,20));
///動(dòng)態(tài)創(chuàng)建參數(shù)name_param;
cmd.Parameters[\"name_param\"].Value=namevalue;
///對(duì)參數(shù)name_param進(jìn)行賦值;
cmd.Parameters.Add(new SqlParameter(\"@pwd_param\",SqlDbType.NVarChar,20));
///動(dòng)態(tài)創(chuàng)建參數(shù)pwd_param;
cmd.Parameters[“pwd_param”].Value=pwdvalue;
///對(duì)參數(shù)pwd_param進(jìn)行賦值;
cmd.Connection.Open();
///打開數(shù)據(jù)鏈接;
int I = ( int ) cmd.ExecuteScalar();
///運(yùn)行SQL語(yǔ)句,并提取返回值;
cmd.Connection.Close();
///關(guān)閉數(shù)據(jù)連接;
return I;
///返回結(jié)果;