您的位置:首页 > 数据库

Sql 注入漏洞攻击

2012-11-27 08:52 309 查看
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S(Browser/Server,浏览器/客户端)模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据进行合法性判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL
Injection,即SQL注入。(摘自百度百科)

正如上面所说,SQL注入漏洞正是通过一段巧妙的SQL语句,从程序返回的结果中获得有用的信息,从而侵入系统。下面就由一个小小的案例登陆程序来向大家演示一下简单的SQL注入。

这个登陆程序由两个textbox(用户名,密码)和一个登陆按钮组成,首先应先建立一个数据库,用于存储用户名和密码,再与程序进行连接,通过由textbox传过来的值与数据库的值进行比较查询,我们通常会这样来写这段代码:

string username = txtUserName.Text;

string password = txtPassword.Text;

using (SqlConnection conn = new SqlConnection(ConStr))

{

conn.Open();

using (SqlCommand cmd =conn.CreateCommand())

{

cmd.CommandText = "select count(*) from T_Users where UserName="+"'"+username+"'"+"and Password="+"'"+password+"'";

if ((int)cmd.ExecuteScalar() != 0)

{

MessageBox.Show("登陆成功!");

}

else

{

MessageBox.Show("登陆失败!");

IncErrortimes();

}

}

}

通过字符串拼接的方式,将程序中的字符串变量username,password与select结合起来,如果有返回值则说明登陆成功,否则登陆失败。这样看似没有什么问题,假如数据库有用户名为:admin,密码为123456的用户,输入后会显示登陆成功,输入其他的自然会显示失败,然而,有一种方式,会使得我们不需要知道密码,就可以登陆,因为它的验证方式是通过字符串拼接来完成的,因此我们可以在密码框内这样写:1'
or '1' = '1 试试看,神奇的事情发生了!程序弹出了登陆成功的对话框,这是什么原因呢?原来,我们写的SQL语句与密码一结合,会产生这样一个语句:

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 ,然后,在后面往其中加入参数,代码如下:

using (SqlCommand cmd =conn.CreateCommand())

{

cmd.CommandText = "select count(*) from T_Users where UserName=@UserName andPassword=@Password";

cmd.Parameters.Add(new SqlParameter("UserName",username));

cmd.Parameters.Add(new SqlParameter("Password",password));

if ((int)cmd.ExecuteScalar() != 0)

{

MessageBox.Show("登陆成功!");

}

else

{

MessageBox.Show("登陆失败!");

IncErrortimes();

}

}

这样,利用参数化查询,将参数放入SQL语句,不会进行字符串的拼接,SQL注入便不攻自破。由此,我们可以看得出来,常说的漏洞,其实看起来也并非想像的那么深奥复杂,只要你用心,也可以找出程序的漏洞,黑客其实并不神秘,只不过他们技术过硬,能从别人精心设计的程序中找到BUG,从而达到入侵的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: