一個恐怖的例子:
注入式攻擊的詳細解釋SQL下面我們將以一個簡單的用戶登陸爲例,結合代碼詳細解釋一下SQL注入式攻擊,與及他的防範措施。對於一個簡單的用戶登陸可能的代碼如下:
try
{
string strUserName = this.txtUserName.Text;
string strPwd = this.txtPwd.Text;
string strSql = "select * from userinfo where UserName='" + strUserName + "' and Password='" + strPwd + "'";
SqlConnection objDbConn = new SqlConnection("數據庫連接字符串");
SqlDataAdapter objAdapter = new SqlDataAdapter(strSql,objDbConn);
DataSet objDataSet = null;
objAdapter.Fill(objDataSet);//TODO 對獲取的數據進行判斷。
}
catch (System.Exception e)
{
this.lblMsg.Text = e.Message;
this.lblMsg.Visible = true;
}
在上面這段代碼中,如果用戶的輸入是正常的用戶名和密碼的話,那麼執行都會比較正常,但是,假如輸入用戶名的時候,輸入的是“johny’--”的話,在 SQLServer裏面執行的語句將會是“select * from userinfo where UserName=’johny’--‘ and Password=’密碼’”,只要數據庫中存在johny這個用戶的話,那麼不管密碼是什麼,語句都能夠執行成功,並且能夠順利通過登陸。還 有更加厲害的,我們知道SQLServer裏面有一些系統的存儲過程,能夠執行操作系統的很多命令,比如xp_cmdshell,假如上面用戶登陸的時
候,用戶名部分輸入的是“johny’ exec xp_cmdshell ‘format d:/s’--”,大家想想一下後果是什麼?有惡意的用戶,只要把’format d:/s’這個命令稍加改造就能夠做很多不合法的事情。
.NET防SQL注入方法
1,利用SqlCommand傳參數的方法:
string strSQL= "SELECT
* FROM [user] WHERE user_id=@id" ; SqlCommand
cmd = new SqlCommand(); cmd.CommandText
= strSQL; cmd.Parameters.Add( "@id" ,SqlDbType.VarChar,20).Value=Request[ "id" ].ToString(); |
2,過濾禁止運行法:
///
<summary> ///
過濾SQL語句,防止注入 ///
</summary> ///
<param name="strSql"></param> ///
<returns>0 - 沒有注入, 1 - 有注入 </returns> public int filterSql( string sSql) {
int srcLen,
decLen = 0; sSql
= sSql.ToLower().Trim(); srcLen
= sSql.Length; sSql
= sSql.Replace( "exec" ,
"" ); sSql
= sSql.Replace( "delete" ,
"" ); sSql
= sSql.Replace( "master" ,
"" ); sSql
= sSql.Replace( "truncate" ,
"" ); sSql
= sSql.Replace( "declare" ,
"" ); sSql
= sSql.Replace( "create" ,
"" ); sSql
= sSql.Replace( "xp_" ,
"no" ); decLen
= sSql.Length; if (srcLen
== decLen) return 0;
else return 1;
} |
3,存儲過程
js版的防範SQL注入式攻擊代碼:
<script
language= "javascript" > <!-- var url
= location.search; var re=/^\?(.*)(select%20|insert%20| delete %20from%20|count\(|drop%20table|update%20truncate%20|asc\(|mid\(|char\(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|\ "|:|net%20user|\|%20or%20)(.*)$/gi; var
e = re.test(url); if(e)
{ alert(" 地址中含有非法字符~ "); location.href=" error.asp"; } //--> <script> |