码迷,mamicode.com
首页 > 数据库 > 详细

深入浅出SQL注入

时间:2014-11-14 14:02:17      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:style   http   io   ar   os   sp   数据   div   on   

之前在做学生信息管理系统和机房收费系统的时候 对于 SQL 注入的问题已经是司空见惯 但是并没有真正的地形象生动的理解 SQL 注入到底是什么玩意儿 直到这次做牛腩才在牛老师的举例之下 明白了原来 SQL 注入是真的很危险啊 .

问题提出

     我们先来构造一个简单的添加新闻类别的程序,在动态网页上添加一个 TextBox控件,一个 Button 控件,一个 GridView 控件。布局如下图所示:

bubuko.com,布布扣

然后为控件编写代码如下:

先来看 SQLHelper 类中用来执行 sql 语句的函数

<span style="font-size:18px;">public int ExecuteNonQuery(string sql)
    {
      int res;
      try
      {
        cmd = new SqlCommand(sql,GetConn());
        res = cmd.ExecuteNonQuery();
      }
      catch (Exception ex)
      {
        throw ex;
      }
      finally {
        if (conn.State ==ConnectionState.Open)
        {
          conn.Close();
        }
      }
      return res;
    }</span>

然后是用来进行插入数据的函数 Insert

<span style="font-size:18px;"> public bool Insert(string caName)
    {
      bool flag = false;
      string sql = "insert intocategory(name) values(‘"+caName +"‘)";
      int res =sqlhelper.ExecuteNonQuery(sql);
      if (res > 0)
      {
        flag = true;
      }
      return flag;
    }</span>

最后是在页面代码中编写按钮的单击事件代码

<span style="font-size:18px;"> protected void Button1_Click(object sender,EventArgs e)
    {
      string caName = TextBox1.Text;
      bool b = newCategoryDAO().Insert(caName);
      Response.Write(b);
      GridView1.DataSource = newCategoryDAO().SelectAll();
      GridView1.DataBind();
    }</span>

调试没问题之后,运行程序,结果如下图

bubuko.com,布布扣

当我们在输入框中输入“奇闻异事 ‘)delete category where id= -- ”之后,单击按钮,结果如下:

bubuko.com,布布扣

当时我看到这个结果的时候,很是震惊,就这么轻易的把数据库里的数据删除了?这是为什么呢?我们把代码中 的 SQL 语句提取出来,然后将输入的内容也放进去,来分析一下原因,如下图

bubuko.com,布布扣

这只是 SQL 注入的一个简单的例子而已,还有好多种形式的 SQL 注入。只要能够获取你的数据库表名(对于高手来说,这个 so easy ),而且你的代码没有经过安全性优化,那么我就可以随意更改甚至删除你的数据,上面的只是删除了一条记录,如果把语句改成 delete category ,那么整个表的数据将会被清空,后果很严重啊。

解决方案:

一种办法就是将输入的内容参数化,即将原本拼接 SQL 语句的方式变成向 SQL 语句中传入参数。具体来讲,就是将 Insert 函数改造一下,并且将 SQLHelper 类中的相应函数也改写一下,代码如下:

先来看SQLHelper的函数如何改写:

public int ExecuteNonQuery(string sql ,SqlParameter [] paras)
    {
      int res;
      using (cmd =new SqlCommand (sql ,GetConn ()))
      {
        cmd.Parameters.AddRange(paras );
        res =cmd .ExecuteNonQuery ();
      }
      return res;
    }

然后是Insert函数的优化代码:

public bool Insert(string caName)
    {
      bool flag = false;
      string sql = "insert into category(name) values(@caName)";
      SqlParameter[] paras = new SqlParameter[]{
        new SqlParameter ("@caName",caName )
      };
      int res = sqlhelper.ExecuteNonQuery(sql, paras);
      if (res > 0)
      {
        flag = true;
      }
      return flag;
    }

优化之后调试没问题,运行程序,结果如下:

bubuko.com,布布扣

我们在输入框中输入“ 奇闻异事 ‘)delete category where id=2 -- ”,然后单击按钮,会出现什么结果呢?请看下图:

bubuko.com,布布扣

    到现在为止,相信你对SQL注入一定有了一个直观的认识和理解,当初做系统的时候只是知道在输入框中输入奇数个英文状态下的单引号,会让你的系统报错甚至死掉,并不知道还可以通过拼接SQL语句对内部数据库进行操作,从而对SQL注入的危害性没有那么深刻的认识,现在终于明白了!

深入浅出SQL注入

标签:style   http   io   ar   os   sp   数据   div   on   

原文地址:http://www.cnblogs.com/dxm2025/p/4097086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!