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