SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S(Browser/Server,浏览器/客户端)模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据进行合法性判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。(摘自百度百科)
正如上面所说,SQL注入漏洞正是通过一段巧妙的SQL语句,从程序返回的结果中获得有用的信息,从而侵入系统。下面就由一个小小的案例登陆程序来向大家演示一下简单的SQL注入。
这个登陆程序由两个textbox(用户名,密码)和一个登陆按钮组成,首先应先建立一个数据库,用于存储用户名和密码,再与程序进行连接,通过由textbox传过来的值与数据库的值进行比较查询,我们通常会这样来写这段代码:
string username = txtUserName.Text;
using (SqlConnection conn = new SqlConnection(ConStr))
通过字符串拼接的方式,将程序中的字符串变量username,password与select结合起来,如果有返回值则说明登陆成功,否则登陆失败。这样看似没有什么问题,假如数据库有用户名为:admin,密码为123456的用户,输入后会显示登陆成功,输入其他的自然会显示失败,然而,有一种方式,会使得我们不需要知道密码,就可以登陆,因为它的验证方式是通过字符串拼接来完成的,因此我们可以在密码框内这样写:1' or '1' = '1
select count(*) from T_Users where UserName='admin' and password='1' or '1' = '1'
不管我们输入的是什么用户名,这条SQL语句执行后始终会返回数据,使得用户名与密码形同虚设。这样就达到SQL注入攻击的目的。想想,如果在正式的公司或网站有这样的漏洞,那么黑客利用此漏洞,入侵系统,会带来多大的损失啊。
那么,既然这样,我们怎么解决呢?呵呵,既然知道问题出在哪,就肯定有解决方案,针对这一漏洞,我们用的是参数化查询语句,即:select count(*) from T_Users where UserName=@UserName andPasssword=@Password ,然后,在后面往其中加入参数,代码如下:
这样,利用参数化查询,将参数放入SQL语句,不会进行字符串的拼接,SQL注入便不攻自破。由此,我们可以看得出来,常说的漏洞,其实看起来也并非想像的那么深奥复杂,只要你用心,也可以找出程序的漏洞,黑客其实并不神秘,只不过他们技术过硬,能从别人精心设计的程序中找到BUG,从而达到入侵的目的。