什么是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[]数组里,方便其他层的代码调用。