• 注册
当前位置:1313e > 默认分类 >正文

参数化防止注入

用到数据库 总逃不过要参数化防止注入 因为有些程序员代码写的简单不完善就给了 一些人钻漏洞的机会 有些还好只是进入你的数据库 有些就恶意篡改你的内容 这就自认倒霉了
具体如何防止 为何防止 我就不贴了 百度一大堆 我就粘贴一下两个参数化防止注入的方法
方法一 :常用的 当数据库内容不多的时候 (推荐)

 string strsql = "insert into Student(Name,Gender,Banji,Student_ID,Phone,QQ,Describe,Time) values (@Name,@Gender,@Banji,@Student_ID,@Phone,@QQ,@Describe,@Time)";SqlParameter[] paras = { new SqlParameter("@Name",name),new SqlParameter("@Gender",gender),new SqlParameter("@Banji",banji),new SqlParameter("@Student_ID",studentid),new SqlParameter("@Phone",phone),new SqlParameter("@QQ",qq),new SqlParameter("@Describe",describe),new SqlParameter("@Time",time)};/// /// 对连接执行 Transact-SQL 语句并返回受影响的行数。错误返回-1/// /// /// /// public bool executeSql(string sqlstr, SqlParameter[] para ){int i = -1;conn.Open();SqlCommand sc = new SqlCommand(sqlstr, conn);try{foreach (SqlParameter item in para){sc.Parameters.Add(item);}i = sc.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{sc.Dispose();}return i > 0;}

方法二:
使用临时表实现(也可以使用表变量性能上可能会更加好些),写法实现上比较繁琐些,
可以根据需要写个通用的where in临时表查询的方法,以供不时之需,个人比较推崇这种写法,
能够使查询计划得到复用而且对索引也能有效的利用,不过由于需要创建临时表,会带来额外的IO开销,
若查询频率很高,每次的数据不多时还是建议使用方案3,
若查询数据条数较多,尤其是上千条甚至上万条时,强烈建议使用此方案,可以带来巨大的性能提升(强烈推荐)

using (SqlConnection conn = new SqlConnection(connectionString))
{conn.Open();SqlCommand comm = new SqlCommand();comm.Connection = conn;string sql = @"declare @Temp_Variable varchar(max)create table #Temp_Table(Item varchar(max))while(LEN(@Temp_Array) > 0)beginif(CHARINDEX(',',@Temp_Array) = 0)beginset @Temp_Variable = @Temp_Arrayset @Temp_Array = ''endelsebeginset @Temp_Variable = LEFT(@Temp_Array,CHARINDEX(',',@Temp_Array)-1)set @Temp_Array = RIGHT(@Temp_Array,LEN(@Temp_Array)-LEN(@Temp_Variable)-1)end    insert into #Temp_Table(Item) values(@Temp_Variable)end    select * from Users(nolock) where exists(select 1 from #Temp_Table(nolock) where #Temp_Table.Item=Users.UserID)drop table #Temp_Table";comm.CommandText = sql;comm.Parameters.Add(new SqlParameter("@Temp_Array", SqlDbType.VarChar, -1) { Value = "1,2,3,4" });comm.ExecuteNonQuery();
}

第二种 我自己还没太懂 毕竟学的比较浅

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录