有一天偶开了个帖子,关于怎么防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的责任了~~