C#引數化(防止SQL注入)
阿新 • • 發佈:2019-01-25
/*
* 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();
*/