sql防注入

什么是SQL注入

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。

sql注入入门

SQL 注入是一类危害极大的攻击形式。虽然危害很大,但是防御却远远没有XSS那么困难。

SQL 注入漏洞存在的原因,就是拼接 SQL 参数。也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞。

SQL注入攻击的总体思路

      1、寻找到SQL注入的位置

      2、判断服务器类型和后台数据库类型

      3、针对不通的服务器和数据库特点进行SQL注入攻击

SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名: ‘or 1 = 1 –

密 码:点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=''or 1 = 1 -- and password=''

分析SQL语句:

条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

这还是比较温柔的,如果是执行

SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''

….其后果可想而知…

 

应对方法

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

过滤原则:对用户输入的数据进行判断,用黑名单,或者白名单的方式验证,或者替换危险字符。
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[]数组里,方便其他层的代码调用。

 

上一篇:线程同步


下一篇:SHELL语言版本的验证码短信接口如何对接