有一天偶開了個帖子,關於怎麼防sql注入 ,最後很感謝各位朋友的鼎力相助,我總結如下!
1、大家都很推薦的參數化!具體我以更新一條數據爲例,包括用存儲過程啥的都是這個意思!!
/// <summary>
/// 更新一條數據
/// </summary>
public bool Update(Ost.Model.P_Product model)
{
StringBuilder strSql=new StringBuilder();
strSql.Append("update P_Product set ");
strSql.Append("CategoryId=@CategoryId,");
strSql.Append("BrandId=@BrandId,");
strSql.Append("Name=@Name,");
strSql.Append("Descn=@Descn,");
strSql.Append("Image=@Image,");
strSql.Append("ImageSmall=@ImageSmall,");
strSql.Append("Price=@Price,");
strSql.Append("VipPrice=@VipPrice,");
strSql.Append("Cheapness=@Cheapness");
strSql.Append(" where ID=@ID");
SqlParameter[] parameters = {
new SqlParameter("@CategoryId", SqlDbType.VarChar,20),
new SqlParameter("@BrandId", SqlDbType.VarChar,20),
new SqlParameter("@Name", SqlDbType.VarChar,80),
new SqlParameter("@Descn", SqlDbType.Text),
new SqlParameter("@Image", SqlDbType.VarChar,80),
new SqlParameter("@ImageSmall", SqlDbType.VarChar,80),
new SqlParameter("@Price", SqlDbType.Decimal,9),
new SqlParameter("@VipPrice", SqlDbType.Decimal,9),
new SqlParameter("@Cheapness", SqlDbType.Int,4),
new SqlParameter("@ID", SqlDbType.Int,4),
new SqlParameter("@ProductId", SqlDbType.VarChar,20)};
parameters[0].Value = model.CategoryId;
parameters[1].Value = model.BrandId;
parameters[2].Value = model.Name;
parameters[3].Value = model.Descn;
parameters[4].Value = model.Image;
parameters[5].Value = model.ImageSmall;
parameters[6].Value = model.Price;
parameters[7].Value = model.VipPrice;
parameters[8].Value = model.Cheapness;
parameters[9].Value = model.ID;
parameters[10].Value = model.ProductId;
int rows=DbHelperSQL.ExecuteSql(strSql.ToString(),parameters);
if (rows > 0)
{
return true;
}
else
{
return false;
}
}
2、過濾字符!
我覺的這個也很重要,一些關鍵字直接給他過濾掉,比如drop 、datebase、delete,and 等一些關鍵字,寫個方法直接過濾掉~!
把單引號替換成兩個單引號!數值型要強制轉換!!!
3、利用Entity Framwork ,LINQ 2者配合也能有效防注!
4、關閉服務器返回提示錯誤。有些人是會根據你的提示錯誤判斷你的表名,數據庫名的,服務器返回提示關掉就可以避免這些問題了!
5、也有人說買防火牆!!! 這就不是coder的責任了~~