美文网首页
写参数化查询语句防止SQL注入

写参数化查询语句防止SQL注入

作者: 十柒年 | 来源:发表于2018-09-15 10:41 被阅读484次

    1.什么是SQL注入,为什么要防止SQL注入

    SQL注入是通过用户提交的数据,拼装成了恶意的数据库执行语句,从而对服务器端造成安全问题的一个漏洞。举个例子,比如在登录页面,正常的情况下,比如我账号输入 zhangsan 密码输入 147258,然后点击登录,服务器端执行的SQL语句可能是。

    select ID,UserName,Account from Users where Account = 'zhangsan' and Password = '147258'
    

    那比如我用户名输入了'or 1 =1--SQL语句就可能变成这样了。

    select ID,UserName,Account from Users where Account = '' or 1=1 --  and Password = ''
    

    这里我们能看到 实际执行的SQL语句为。select ID,UserName,Account from Users where Account = '' or 1=1
    条件为真,--在SQL中 是注释符号。所以连密码都不需要直接就可以登录成功了。在看一个比较严重的例子。
    比如我输入了。';drop table Users;-- 或者我知道你的数据库名字 ';use master go drop database MyBlog;--那么实际执行的SQL语句为。

    select ID,UserName,Account from Users where Account ='';drop table Users;--and Password = ''
    select ID,UserName,Account from Users where Account ='';use master go drop database MyBlog;--and Password = ''
    

    如果写代码的时候没有注意这些,黑客很可能通过这些漏洞进行攻击,造成巨大的损失。

    2.如何防治SQL注入

    防止SQL注入一般有三种方法。

      1. 过滤原则:对用户输入的数据进行判断,用黑名单,或者白名单的方式验证,或者替换危险字符。
    • 2.写数据存储过程:这个还是有一定的风险有可能会有漏网之鱼,还有就是查询太多的话,存储过程也会写的特别的多,但是写存储过程会提高查询的效率,有一定好处。
    • 3.使用参数化查询语句进行查询,这也是本文重点介绍的一种方式。
      请看示例。
     string Account =Request.Form["Account"];  
     string sql = "select id,Name,Account from User where Account = @Account";
     SqlParameter[] values = new SqlParameter[] {  //参数化查询, 防止sql注入
                        new SqlParameter("@Account",Account),
           };
     DataTable datatable = DBHelper.GetDataTable(sql, values);
    

    这里把用户传到后台的账号Account 赋值给 @Account这样一来,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行。另外GetDataTable是一个封装好的方法。代码如下。

       public static DataTable GetDataTable(string sql, params SqlParameter[] values)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                DataSet ds = new DataSet();
                SqlCommand cmd = new SqlCommand(sql, connection);
                cmd.Parameters.AddRange(values);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);
                return ds.Tables[0];
            }
        }
    

    把需要的参数放到SqlParameter[]数组里,方便其他层的代码调用。
    Study hard and make progress every day.

    更多学习资料请关注"爱游戏爱编程"。


    爱游戏爱编程.jpg

    相关文章

      网友评论

          本文标题:写参数化查询语句防止SQL注入

          本文链接:https://www.haomeiwen.com/subject/fnszgftx.html