深入浅出SQL注入

原文:深入浅出SQL注入

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

问题提出:

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

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

先来看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>

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

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

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

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

解决方案:

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

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

 <span style="font-size:18px;">public int ExecuteNonQuery(string sql ,SqlParameter [] paras)
        {
            int res;
            using (cmd =new SqlCommand (sql ,GetConn ()))
            {
                cmd.Parameters.AddRange(paras );
                res =cmd .ExecuteNonQuery ();
            }
            return res;
        }</span>

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

<span style="font-size:18px;"> 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;
        }</span>

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


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

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

            

       

时间: 2024-09-26 05:04:07

深入浅出SQL注入的相关文章

SQL预编译和SQL注入

再说SQL预编译: 最近用go语言时,学习了一下数据库连接的库,这里总结一下SQL预编译相关的知识.貌似网上都是建议使用预编译,我也觉得这种做法靠谱. 先谈 SQL注入: SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过让原SQL改变了语义,达到欺骗服务器执行恶意的SQL命令.其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统. 其实,反过来考虑,这也是SQL这类解释性语言本身的缺陷,安全和易用性总是相对的.类似的Sh

ASP通用防注入代码.杜绝SQL注入隐患.提升网站安全

ASP通用防注入代码.杜绝SQL注入隐患.提升网站安全 <% '''''''''''''''''''''''''''''''''''''''''''''''' 'ASP通用防注入代码 '您可以把该代码COPY到头文件中.也可以单独作 '为一个文件存在,每次调用使用 '作者:y3gu - 2005-7-29 '''''''''''''''''''''''''''''''''''''''''''''''' Dim GetFlag Rem(提交方式) Dim ErrorSql Rem(非法字符) Di

SQL注入攻击:防御和检查SQL注入的手段

虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施.知彼知己,方可取胜.首先要清楚SQL注入攻击有哪些种类. 观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. SQL注入攻击的种类 知彼知己,方可取胜.首先要清楚SQL注入攻击有哪些种类. 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤

关于SQL注入的几类错误和产生的原理

对于注入而言,错误提示是极其重要.所谓错误提示是指和正确页面不同的结果反馈,高手是很重视这个一点的,这对于注入点的精准判断至关重要.本问讨论下关于几类错误和他产生的原理,希望对读者有所帮助. 错误提示主要有逻辑错误和语法错误以及脚本运行错误三类. 一:逻辑错误 简单的例子是1=1 1=2这两个,1=1与1=2页面不同的原理是什么?以$sql = "select * from news where id=$_GET[id]"为例. select * from news where id=

利用SQL注入,通过dbo获得SQL管理权限和系统权限

我做了如下测试:(1) http://www.xxx.com/new/new.asp?id=49' Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14[Microsoft][ODBC Microsoft Access Driver] 字符串的语法错误 在查询表达式 'ID=49'' 中. /new.asp,行36 (2) http://www.xxx.com/new/new.asp?id=49 and 1=1(正常返回页面) (3) h

鲜为人知的SQL注入技巧

技巧|sql注入 1.关于Openrowset和Opendatasource2.关于Msdasql两次请求的问题3.可怕的后门        下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力,当然也有点幸运的 成分在内,才得以发现,不敢一个人独享,拿出来请大家鉴别. 1.关于Openrowset和Opendatasource 可能这个技巧早有人已经会了,就是利用openrowset发送本地命令.通常我们的用 法是(包括MSDN的列子)如下: select * from op

ASP.NET优化:Sql注入和Html注入的黑帽SEO

黑帽(black hat)SEO主要是指采取"不怎么道德"(暂时就这么形容吧!)的方式进行搜索引擎优化. 1. 注入攻击,包括Sql注入和Html注入.我经常能看到对Sql注入防范的谈论,但对于Html注入,很多人并没有引起足够的重视.为了展示Html注入的效果,我们模仿了一个常见的留言本功能. 首先,在页面声明中添加两个属性设置EnableEventValidation="false" ValidateRequest="false" ,这很关键

批量替换sqlserver数据库挂马字段并防范sql注入攻击的代码

首先备份数据库,以防不必要的损失.而后对所有被挂马的小于8000字符的varchar字段执行 复制代码 代码如下: update 表名 set 字段名=replace(字段名,'<Script Src=http://c.n%75clear3.com/css/c.js></Script>','') 其中<Script Src=http://c.n%75clear3.com/css/c.js></Script>为挂马字段.执行后挂马字段被清除.但是有部分字段,比

SQL注入与ASP木马上传

木马|上传 SQL注入后,如何上传木马,一直是比较头疼的事,我这里提供上传木马的一种另一种方法.1.SQL注入的时候,用xp_cmdshell 向服务器上写入一个能写文件的asp文件.文件内容:<%Set objFSO = Server.createObject("Scripting.FileSystemObject")Set objCountFile=objFSO.createTextFile(request("mypath"),True)objCountF