Sql 注入漏洞攻击

来源:互联网 发布:税控盘开票软件 编辑:程序博客网 时间:2024/04/28 14:26

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/SBrowser/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,从而达到入侵的目的。

原创粉丝点击