引言
SQL注入在当前编程中是非常重要的话题,在较大的Web项目中程序员都在编程的过程中避免SQL的注入,因为有很多网站信息的泄露都是因为恶意的SQL注入造成的,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.所以我们应该对SQL注入有一定的了解并且在编程的过程中有意去避免它。
SQL注入实例
首先看一下我们这个Web小例子中SQLHelper类中的方法:
public class SQLHelper { private SqlConnection conn = null; private SqlCommand cmd = null; private SqlDataReader sdr = null; public SQLHelper() { string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; conn = new SqlConnection(connStr); } /// <summary> /// 打开数据库连接 /// </summary> /// <returns></returns> private SqlConnection GetConn() { if (conn .State ==ConnectionState .Closed ) { conn.Open(); } return conn; } /// <summary> /// 执行的增删改SQL语句 /// </summary> /// <param name="sql">增删改SQL语句</param> /// <returns>受影响的行数</returns> public int ExecuteNonQuery(string sql) { int res; using (cmd = new SqlCommand(sql, GetConn())) { res = cmd.ExecuteNonQuery(); conn.Close(); } return res; }
我们可以看出在SQLHelper中执行增删改的语句的时候,我们直接用的动态的sql语句,这样我们在Web界面中插入的时候如果在文本框中输入下面这么一条语句:
娱乐新闻')delete category where id =3--
执行前的结果:
执行后的结果:
从上面这个小例子能够看出我们可以在Web界面中任意的构造恶意的动态SQL语句来破坏或者盗取数据库中的信息,这就是所谓的SQL注入。
SQL注入的原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
SQL注入的避免
首先我们来回想一下我们在个人版机房中的SQLHelper类中的方法,我们并没有直接构建动态的SQL语句来实现,而是通过传入参数来完成相应的操作,当初我们只是简单的了解然后就用了,其实这就是一个最基本最有效的避免SQL注入的方法。
利用带有参数的SQLHelper方法,核心代码如下:
public int ExecuteNonQuery(string sql,SqlParameter []paras) { int res; using (cmd = new SqlCommand(sql, GetConn())) { cmd.Parameters.AddRange(paras); res = cmd.ExecuteNonQuery(); conn.Close(); } return res; }
再执行上面的插入语句,操作结果如下:
防止的方法总结如下:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
小结
SQL注入会给我们的Web项目带来很大的破坏,虽然现在我们防止SQL注入的技术是比较成熟的,但是作为我们这新一代的程序员还是需要不断的了解这些潜在的危害,不能忽视,因为这些东西这是在不断的更新,不断的增强攻击力,所谓“知己知彼,百战不殆”所以我们应该深入的了解它,然后用更有效的方法避免。