比如:
string sql=”insert into category(name) values(‘ ”+name+” ’)"; //這樣的數據輸入是通過雙引號進行的字符串拼接"+字符串
注入語句:aaa’)delete category where-- //--表示,--后面的代碼被注釋掉后,就不執行了
而在單獨的SQL語句中:insert into category(name) values(‘aaa’)
insert into category(name) values(‘aaa’)delete category where--')
若要防止SQL注入,可以使用帶參數的@字符串,表示參數而不是字符串;
string sql=”insert into category(name) values(@caName)"; //去掉@caName外面本來的單引號
接下來時賦值給@caName:
SqlCommand.Parameters.Add(new SqlParameter ("@caName “,"jazyzheng"));//把jazyzheng賦值到參數caName中
重新賦值為SQL注入語句:
SqlCommand.Parameters.Add(new SqlParameter ("@caName “,"aaa’)delete category where--"));
當在前臺輸入數據后(aaa’)delete category where--),數據是通過參數傳入的,而不是通過直接的字符串拼接方式傳入,所以輸入的數據會直接被當做參數,而不會當做字符串而執行字符串中的SQL語句。
有SqlCommand.Parameters.Add(),也有SqlCommand.Parameters.AddRange()。
有時候插入的SQL語句參數不止一個,比如當插入新聞的時候,就會插入諸如標題,內容,時間等多個參數。AddRange傳入的是一個數組。
SqlCommand.Parameters.AddRange(new SqlParameter[]
{
new SqlParameter("@caName","jazyzheng ")
});
比較完整的代碼:
public int ExecuteNonQuery(string sql, SqlParameter[] paras)
{
int res;
using (cmd = new SqlCommand(sql, GetConn()))
{
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
public bool Insert(string caName)
{
bool flag = false;
string sql = "update category set [name]=@caName where id=@id";//需引用using System.Data.SqlClient;
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter("@id",ca.Id),
new SqlParameter("@caName",ca.Name)
};
int res = sqlhelper.ExecuteNonQuery(sql, paras);
if (res > 0)
{
flag = true;
}
return flag;
}