1. 程式人生 > >C#引數化(防止SQL注入)

C#引數化(防止SQL注入)

/*
* C#防止SQL注入式攻擊
* Author:ICE FROG
* TIME:2016/4/20
*/

/*
* SQL注入式攻擊就是值通過SQL執行語句的漏洞進行百分百匹配條件的攻擊
* 那麼在執行語句的where語句後面的條件就永遠為true
*
* C#在資料庫的這一塊漏洞上添加了一個類來處理這個問題:
* SqlParameter - using System.Data.SqlClient;
* 原理就是讓where條件後面欄位不和整個執行語句化為一個字串,而是以通過一個引數的形式傳遞進去
* 這樣可以達到兩個效果:
* 第一就是避免注入式攻擊
* 第二就是防止非法字元導致軟體崩潰
* 那麼我們需要把原來的sql執行語句比如:string.format(“select * from user where id=’{0}’ and pwd = ‘{1}’”,id,pwd)
* 更改為: “select * from user where id = @id and pwd = @pwd”;
* 我們使用了@名 代替了佔位符,而這個@名 原先是不存在不需要宣告的。只需要在後面使用上面那麼類宣告一下就ok
* Code:
*

        SqlParameter i = new SqlParameter("@id",id);
 *      SqlParameter j = new SqlParameter("@pwd",pwd);
  • //第一引數是在sql語句中出現的名字,第二個引數是用來代替這個變數的真實的值-第一個引數需要用雙引號
  • 那麼我們資料庫執行語句搞定了,我們接下來會需要使用SqlCommand類來操作資料庫,我們也需要對這個物件宣告這個執行語句中的變數的意思
  • Code:
        SqlCommand cmd = new SqlCommand(sql,conn);
 *      cmd.Parameters
.Add(i); * cmd.Parameters.Add(j);
  • //有幾個引數就新增幾個
  • 如果使用者使用的是介面卡- SqlDataAdapter
  • Code:
 *      SqlDataAdapter dat = new SqlDataAdapter(sql,conn);
 *      dat.SelectCommand.Parameters.Add(i);
 *      dat.SelectCommand.Parameters.Add(j);

    • 完整例項:
  • Code:
            SqlConnection conn = new SqlConnection("..."
); conn.Open(); string sqlSentence = "select * from user where id = @id and pwd = @pwd"; SqlParameter id = new SqlParameter("@id",value1); SqlParameter pwd = new SqlParameter("pwd",value2); SqlCommand cmd = new SqlCommand(sqlSentence,conn); //SqlDataAdapter dat = new SqlDataAdapter(sqlSentence,conn); //dat.SelectCommand.Parameters.Add(id); //dat.SelectCommand.Parameters.Add(pwd); cmd.Parameters.Add(id); cmd.Parameters.Add(pwd); object obj = cmd.ExecuteScalar(); conn.Close();

*/