参数化防止注入

简介: 用到数据库 总逃不过要参数化防止注入 因为有些程序员代码写的简单不完善就给了 一些人钻漏洞的机会 有些还好只是进入你的数据库 有些就恶意篡改你的内容 这就自认倒霉了 具体如何防止 为何防止 我就不贴了 百...

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

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

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

目录
相关文章
|
6月前
|
XML 安全 数据库
24、显错注入(updatexml和extractvalue)
24、显错注入(updatexml和extractvalue)
50 0
|
16天前
|
SQL 安全 关系型数据库
beescms注入
通过 SQL 注入、弱口令爆破和文件上传三种方式对系统进行安全测试的过程。首先,通过手动注入和报错注入获取数据库信息,接着利用弱口令爆破工具尝试登录,最后通过修改 MIME 类型绕过文件上传限制,成功获取 shell。
beescms注入
|
6天前
参数化测试
参数化测试
14 0
|
6月前
|
数据库
报错注入
报错注入
36 1
|
6月前
|
SQL 数据库
SQL注入基础(报错注入及延时注入)
SQL注入基础(报错注入及延时注入)
49 0
|
6月前
|
数据库
13、报错注入(Get)
13、报错注入(Get)
30 0
|
6月前
|
SQL 关系型数据库 MySQL
注入工具 -- sqlmap(注入参数)
注入工具 -- sqlmap(注入参数)
106 0
|
6月前
|
SQL 安全 关系型数据库
05GET注入-盲注
【1月更文挑战第6天】给单位零基础小伙伴准备的网安入门教程,本教程是基于蚁景实验室搭建,基于自建虚拟机搭建需自行准备前置环境,05GET注入-盲注 ,请遵守网络安全法!请遵守网络安全法!请遵守网络安全法!请勿破坏公共网络网络安全!
|
6月前
|
SQL 关系型数据库 MySQL
Mysql注入 -- 堆叠注入
Mysql注入 -- 堆叠注入
162 0
|
11月前
|
Python
关于SSTI模块注入的常见绕过方法
关于SSTI模块注入的常见绕过方法
216 0