【SQL Server】SQL注入

前言

        看牛腩前几集的时候,发现并没有什么区别于C/S的地方,语言一样,只不过是界面显示由窗体变成了网页。但是就是这些一样中,我发现了新的知识,或者说是对旧的知识新的理解。

SQL注入

        早在敲学生管理系统的时候就总听师傅和同期人说sql注入sql注入,但是sql注入究竟是什么东西呢?当时只知道在需要查询数据库的地方加一个“'”就会形成sql注入进而产生错误。这到底是为什么当时也没细究,学生管理系统和机房收费系统都已经敲过去了,只知道对这个错误限制掉,却不知道它产生的原因究竟是什么,需要做个反省了,为什么没有去探究这个呢?现在先不说这个,在敲牛腩的时候,我发现了其中的奥秘。

        废话不多说,数据库查询语句大家都知道,我举个例子,比如,我们要在卡表中查找卡号等于textbox中输入的一行数据,在语句中,我们可能就会这样写:select * from T_Card where CardNo = textbox.text  ;这行语句反映到数据库中就是:select * from T_Card where CardNo = ‘我们输入的字符’  ;所以,当我们在输入框加入一个“'”的时候,比如,我们输入:1'234。我们在数据库中的到的查询语句就会变成:select * from T_Card where CardNo = ' 1 ' 234 '  ;发现什么没有,是不是出现了三个单引号?首先,这在格式上是不正确的,sql server就会自动报错,后面的234'就是它的错误格式。跟我一样没对这个进行探索的同学,是不是恍然大悟了?

        如果说仅仅是一个查询格式,出错了也不会产生什么太大影响,大不了重新开启一次系统,不这么做就好了,(当然,一款大系统如果存在这样的问题也不是小问题了),但是下面我要说的,才是这个问题的真正严重所在。

        如果这个不是查询格式,而是插入(insert)或者删除(delete)的语句,想一下问题是不是就大了呢?举个例子。

        如果我在输入框输入:1';delete * from T_Card where CardNo='1'-- ;(注:分号为sql语言间隔符,用了分号就可以将两行语句写到一行上;两个减号为sql语句的注释符,它后面的语句全是注释)。体现到真正的sql server数据库中,这条语句就变成了:select * from T_Card where CardNo = '1'  ;  delete * from T_Card where CardNo='1' --'其中,绿色字体就是注释,很显然,这条语句其实是两条语句,分别执行了两个sql语句,先把卡号是1的卡信息查出来,然后删除卡号是1的卡。是不是相当的恐怖。用户通过简单的查询框就完成了删除其他用户的操作,这对一个系统无异于毁灭性的打击。

        这就是黑客常用的sql注入技术,不过随着近年来计算机技术的发展,这样的问题得到了改善。体现到机房收费系统中具体怎么做呢?

        就是在D层查询的时候,不直接将参数传入sql语句,而是使用参数化查询(SqlParameter),将参数先赋值到SqlParameter参数中,然后传入sql语句,如下:

//修改密码!
        public bool ModiffyPwd(Entity.UserInfo UserInfo)
        {
            #region//赋值
            SqlParameter[] sqlParams = 
            { 
                new SqlParameter("@userID", UserInfo.UserID), 
                new SqlParameter("@OldPassWord", UserInfo.PassWord),
                new SqlParameter("@NewPassWord",UserInfo.NewPwd)
            };
            #endregion
            string sql = @"UPDATE [T_USERS] SET PassWord=@NewPassword WHERE UserID=@UserID AND PassWord=@OldPassword";//查询符合条件的数据
            bool flag = SqlDAL.SQLHelper.ExecuteNonQuery(sql, CommandType.Text, sqlParams);//调用SqlHelper中的无返回值的方法
            return flag;
        }
        这样就能避免sql注入的情况产生。能避免的原因是由于参数化查询使用了两个策略:

1、参数过滤;

2、执行计划重用。

        参数过滤之后是不产生sql注入的可选方案,但是真正起到防止sql注入的,还是参数化查询可以执行计划重用,也就是说,我们的查询语意不会随着输入内容的不同而改变,就如我们小学做的填空题一样,查找密码是(____) 并且用户名是(____)的用户。真正达到了防止sql注入的目的。

总结

        我们很多是时候是清楚这个问题的存在,却又不知道它因何而存在,如果这时候能勇于探索,主动的去学习,其结果要比这样被动的学习要好得多,也许,如果当初我认真去做了第一遍,也许这次就能学到更多。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值