SqlParameter可以防止sql注入問題
表示SqlCommand物件的參數,或與DataSet中列的對應。
SQL語句正確寫法要 搭配使用參數寫法,避免
SQL Injection攻擊
(@參數名稱 + SqlParameter的方式放入)
常用屬性:
- DbType:表示參數的資料類型(資料庫中的類型)
- Direction:參數的類型(輸入、輸出、輸入輸出、回傳值參數)
- ParameterName:參數的名稱
- Size:參數最大大小,以位元組為單位
- Value:參數值
- SqlValue:作為Sql類型的參數的值
為何使用 SQLParameter 物件?
- 在插入資料的SQL陳述句,若能使用 Parameter 將會提高安全性,若使用者輸入了特別符號,也比較不會出問題;
- Parameter 可以 (1)檢查參數的型別 (2)檢查資料長度 (3)確保參數為非可執行的SQL命令
使用 SQLParameter 物件
使用具名參數,例如:
1
SELECT * FROM Customers WHERE CustomerID = @CustomerID -- @CustomerID 具名參數
主要是使用”@參數名稱”,來代替原本的變數。
1
2
3
4
5
6
7
8
//原本的sql語句
string sql = @"update emp set EmpName = '張三' where EmpId = 1";
//改成 使用"@參數名稱",來代替原本的變數
string sql = @"update emp set EmpName = @EmpName where EmpId = @EmpId";
// @EmpName 為參數,empName 為對應參數的數值
cmd.Parameters.AddWithValue("@EmpName", empName);
寫法一:Parameters.AddWithValue
1
2
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", id);
寫法二:Parameters.Add
1
2
cmd.Parameters.Add("@id", SqlDbType.NVarChar);
cmd.Parameters["@id"].Value = id;
寫法三:Parameters.Add 方法加入 SQLParameters 類別
1
cmd.Parameters.Add(new SqlParameter("@id", id));
寫法四:Parameters.AddRange 方法放入 SQLParameters陣列
1
2
3
4
5
6
//定義參數和要傳入的值
SqlParameter[] parameters = { //參數陣列
new SqlParameter("@EmpId", 1),
new SqlParameter("@EmpName","張三")
};
cmd.Parameters.AddRange(parameters);
範例
- 更新 員工編號=1 的名字,改成 “張三”
- 使用參數的方式 (4種寫法):
- Parameters.AddWithValue
- Parameters.Add
- Add方法中 加SqlParameter類別
- AddRange方法 放入SqlParameter陣列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
string connString = "Data Source=.;Initial catalog=DBTEST;User id=riva;Password=1234;Encrypt=true;Trust Server Certificate=True";
//建立與sql server的連線
using (SqlConnection conn = new SqlConnection(connString))
{
//開啟資料庫連線
if (conn.State != ConnectionState.Open) conn.Open();
//SQL語句(正確寫法是要 配合使用參數寫法,避免 SQL Injection 攻擊 -- @參數名稱+SqlParameter 的方式放入)
string sql = @"update emp set EmpName = @EmpName where EmpId = @EmpId";
//告訴SqlCommand要執行的SQL
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
//使用SqlParameter參數
//寫法1:Add
cmd.Parameters.Add("@EmpId", SqlDbType.Int);
cmd.Parameters.Add("@EmpName", SqlDbType.NVarChar);
cmd.Parameters["@EmpId"].Value = 1;
cmd.Parameters["@EmpName"].Value = "張三";
//寫法2:AddWithValue
//定義參數和要傳入的值
cmd.Parameters.AddWithValue("@EmpId", 1);
cmd.Parameters.AddWithValue("@EmpName", "張三");
//寫法3:Add方法裡加SqlParameter類別
cmd.Parameters.Add(new SqlParameter("@EmpId", 1));
cmd.Parameters.Add(new SqlParameter("@EmpName", "張三"));
//寫法4:AddRange方法放入SqlParameter陣列
//定義參數和要傳入的值
SqlParameter[] parameters = { //參數陣列
new SqlParameter("@EmpId", 1),
new SqlParameter("@EmpName","張三")
};
cmd.Parameters.AddRange(parameters);
// 1代表 異動筆數共有一筆,代表更新成功
if (cmd.ExecuteNonQuery() == 1)
{
Console.WriteLine("更新成功");
} else
{
Console.WriteLine("更新失敗");
}
}
}
MSDN - SqlParameterCollection.AddWithValue(String, Object) 方法
MSDN - SqlParameter 類別
SqlCommand.CommandType 屬性
MSDN - SqlCommand.CommandText 屬性
CSDN - Ado.Net学习——基础知识记录
[ADO.NET] 為何 / 如何 使用 SQLParameter 物件 by 余小章
[ADO.NET] Command 物件 – Draft by R
[ADO.NET] Command 物件 (執行SQL命令) by R
[C# 筆記] .NET Core 使用 ADO.NET 預存程序(Stored Procedure) 實作 CRUD by R
[C# 筆記] .NET Core 7.0 使用 ADO.NET 實作 CRUD 操作 by R