参数化防止注入

本文介绍了两种SQL参数化方法来防止SQL注入攻击,一种适用于小型数据库应用,另一种通过创建临时表来处理大量数据查询,有效提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 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)
                                  };


                                     /// <summary>
    /// 对连接执行 Transact-SQL 语句并返回受影响的行数。错误返回-1
    /// </summary>
    /// <param name="sqlstr"></param>
    /// <param name="para"></param>
    /// <returns></returns>
    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)
        begin
            if(CHARINDEX(',',@Temp_Array) = 0)
            begin
                set @Temp_Variable = @Temp_Array
                set @Temp_Array = ''
            end
            else
            begin
                set @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();
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值