防止SQL注入


一個恐怖的例子:

注入式攻擊的詳細解釋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>

 

  

 


總結:在編寫代碼前一定要細心考慮每種存在的安全性隱患。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM