有一天偶开了个帖子,关于怎么防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; } }
我觉的这个也很重要,一些关键字直接给他过滤掉,比如drop 、datebase、delete,and 等一些关键字,写个方法直接过滤掉~!
把单引号替换成两个单引号!数值型要强制转换!!!
3、利用Entity Framwork ,LINQ 2者配合也能有效防注!
4、关闭服务器返回提示错误。有些人是会根据你的提示错误判断你的表名,数据库名的,服务器返回提示关掉就可以避免这些问题了!
5、也有人说买防火墙!!! 这就不是coder的责任了~~