ADO。Net(二)——防止SQL註入攻擊
規避SQL註入
如果不規避,在黑窗口裏面輸入內容時利用拼接語句可以對數據進行攻擊
如:輸入Code值
p001‘ union select * from Info where ‘1‘=‘1 //這樣可以查詢到所有數據,不要輕易相信用戶輸入的內容
防止SQL註入攻擊
通用方法:可以用正則匹配掉特殊符號
推薦方法:再給命令發送SQL語句的時候分兩次發送
把SQL語句拆成兩塊
用戶輸入的是一塊;本身寫好的是一塊
第一次把CommandText裏寫的sql語句發過去;第二次把變量值發過去,進行匹配
例:
使列名等於一個變量名
改變量綁定參數 cmd.Parameters.AddWithValue("變量名稱",變量值)
cmd.Parameters是對象裏面的一個屬性,返回值是一個集合
有時會用到同樣的變量名 所以在綁定參數之前先清除一下cmd.Parameters.Clear();
static void Main(string[] args)
{
//接收用戶輸入的查詢條件
Console.WriteLine("請輸入要查詢的汽車代號:");
string code = Console.ReadLine();
//造連接對象
SqlConnection conn = new SqlConnection("server=.;database=mydb;user=sa;pwd=123");
//造命令對象
SqlCommand cmd = conn.CreateCommand();
//給命令對象一條SQL語句
//使code=一個變量
cmd.CommandText = "select * from Car where Code=@code";
//cmd.CommandText = "select * from Car where Code=@code or Name=@name";
//改變量綁定參數
cmd.Parameters.Clear();//清除綁定的變量,最好每次用參數集合前寫一個清除
cmd.Parameters.AddWithValue("@code",code);
//cmd.Parameters.AddWithValue("@name",name);//有多少列綁多少個
//打開連接
conn.Open();
//執行SQL語句
SqlDataReader dr = cmd.ExecuteReader();
//讀取數據
if (dr.HasRows)
{
while (dr.Read())
{
Console.WriteLine(dr[0] + "--" + dr[1]);
}
}
else
{
Console.WriteLine("沒有查到相應的數據");
}
//關閉連接
conn.Close();
Console.ReadLine();
}
ADO。Net(二)——防止SQL註入攻擊