博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出SQL注入
阅读量:7090 次
发布时间:2019-06-28

本文共 2784 字,大约阅读时间需要 9 分钟。

原文:

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

问题提出:

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

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

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

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;        }

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

 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;        }

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

 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();        }

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

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

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

这只是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;        }
        优化之后调试没问题,运行程序,结果如下:

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

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

            

       

你可能感兴趣的文章
canvas线条的属性
查看>>
基础006_pg109_IP-Xfft
查看>>
[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口...
查看>>
为什么 c = tf.matmul(a, b) 不立即执行矩阵乘法?
查看>>
Linux 变量引用和命令替换
查看>>
各大互联网公司架构演进之路汇总
查看>>
[转载].NET平台测试驱动开发模拟框架Moq简明教程(简介)
查看>>
xmlHttp
查看>>
Eclipse编译报Javascript和jquery错的解决办法
查看>>
C#字符串的简单用法
查看>>
EXPORT_SYMBOL的使用并以使用do_adjtimex调节内核tick_length(滴答长度)为例的说明...
查看>>
什么是VC维?
查看>>
SuperMap IS.NET自定义Action之兴趣点标注(转)
查看>>
eclipse 创建maven 项目 动态web工程完整示例 maven 整合springmvc整合mybatis
查看>>
[Unit Testing] AngularJS Unit Testing - Karma
查看>>
Java NIO和IO的区别(转)
查看>>
Integer与int的区别(转)
查看>>
JavaScript 解决 onblur 与 onclick 冲突
查看>>
cocos2d-x 事件分发机制 ——加速计事件监听
查看>>
物理层
查看>>