1. 程式人生 > >ADO。Net(二)——防止SQL註入攻擊

ADO。Net(二)——防止SQL註入攻擊

多少 ext args create 查詢 屬性 匹配 拼接 註入

規避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註入攻擊