如何预防SQL注入

  以前我出去面试时,人家问我什么叫SQL注入,我很迷芒的告诉人家:我不知道,因为我从来没有遇到过这类情况。
后来随着SQL注入渐入流行,我才发现,其实SQL注入是因为程序员写程序时的不良习惯导致的一类漏洞的总称。其主要原因是程序员没有处理好SQL语句中的单引号“'”。例如,在数字型参数中,没有用程序去判断用户输入或提交的内容是否是有效的数字。在文本型参数中,没有去判断用户输入的内容是否带单引号。至于注入的基本原理外面到处都可以查到,我这边就不占用篇幅了。
  其实SQL注入的问题不仅仅存在于网页,同时也存在于CS结构的数据库软件界面中。
  最简单的处理方法是,把所有用户的输入内容全部用替换语句把一个单引号替换成2个单引号;同时对数字、日期等类型作有效性检测。这样就可以杜绝SQL注入。
  但如果一个大型网站中,已经存在有该漏洞了怎么办? 我们可以用一个较为简单的办法来处理,就是去判断所有网页REQUEST参数,然后筛选或替换掉有害内容即可。
  可能很多人已经尝试了把提交过来的FORM和QUERYSTRING作了筛选,但结果还是被注入。其原因主要有2点:第一,其筛选的内容不够完整。之前我有看过一段人家写的过滤代码,只过滤了DELETE,UPDATE,INSERT等几个很常用的关键字连EXEC都没列进去就对外宣称自己过滤了哪些内容,并警告人家不要攻击。简直幼稚到让人无语!因为大多人注入一个网站都使用的是2进制编码注入,而这仅需要用CAST来转换,用EXEC来执行。所以我们在作有害内容筛选时,除了把UPDATE、DELETE、INSERT等内容滤掉外,还要把这2个关键字滤掉。当然如何处理大小写我就不赘述了。
  第二,那是因为程序中使用了偷懒的办法来获取提交的数据,直接用REQUEST来获取所有REQUEST.FORM和REQUEST.QUERYSTRING的内容。这样就存在一个问题,你们是否知道REQUEST也可以获取来自REQUEST.COOKIES的内容?如果有无聊的人在访问你们网站时提交了假冒的COOKIE,那你们网站的REQUEST也就接受了该内容。所以过滤时别忘了把COOKIES也加进来。
    另外,安全性防范在全面性方面肯定无法穷尽,所以请不要对外公开你们自己的安全性策略,以免引诱人家攻击你们的网站。

 

附上过滤代码以供参考:

 

Dim sql_injectdata,sql_inject, _Counting

sql_injectdata = "'|and|exec|insert|select|delete|update|count|*|cast|%|chr|mid|master|truncate|char|declare|;|--"

sql_inject = split(sql_injectdata,"|")

For Each GetString In Request.Form

              for _Counting = 0 to ubound(sql_inject)

               if InStr(lcase(request(GetString)), sql_inject(_Counting)) > 0 Then

                   Response.Write "<Script Language=JavaScript>window.close(); </Script>"

                   Response.End

               End If 

        next

Next

 

For Each GetString In Request.QueryString

              for _Counting = 0 to ubound(sql_inject)

               If InStr(lcase(request(GetString)), sql_inject(_Counting)) > 0 Then

                   Response.Write " <Script Language=JavaScript>window.close(); </Script>"

                   Response.End

               End If 

        Next

Next

 

For Each GetString In Request.Cookies

              for _Counting = 0 to ubound(sql_inject)

               If InStr(lcase(request(GetString)), sql_inject(_Counting)) > 0 Then

                   Response.Write " <Script Language=JavaScript>window.close(); </Script>"

                   Response.End

               End If 

        Next

Next

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值