日期:2014-05-17  浏览次数:20779 次

浅析SQL注入
SQL注入是什么,我就不用说了,如果你真的不知道你可以去网上搜一下。
防止注入概括起来其实就是 
1 类型检查 (检查得到的数据类型是不是符合要求的类型)
2 变量范围检查 (得到的变量的长度都是有个范围的,检查是否符合)
3 特殊字符过滤 (主要就是过滤 , " % 空格等特殊字符)
4 sql关键字过滤 (主要是exec|insert|select|delete|update| truncate |drop|master|SysColumns|SysMembers|sysusers等字符)

发贴的主要目的是讨论一下,得到一个行之有效的防止SQL注入的方法。
由于本人没有玩黑的经验,所以只是停留在理论之上,对于很多的方法还是报质疑的态度。
请有经验,有想法的人来谈谈你们的看法,分不是问题。



------解决方案--------------------
根据流行的注入工具来加强自己的系统
------解决方案--------------------
什么都被你浅析了呀!!
注入,词面上的含义也是他实质的意义.很多文章都介绍得很好,从原理到综合利用,由浅入深.
个人理解注入的灵魂就在于构造,而防范就在于防止存在这种机会的可能性.而构造是基于sql语句自身的特点和程序中生成语句的方法.不恰当的方法就给构造造成了更多的机会.很多实例在网络文章中多有介绍.而多数的注入工具是基于这些特点利用程序的报错信息来暴库的.
下面举出部分例子(主要对sqlserver;access由于不支持多句,注入暴库方法更繁琐,相对更安全一些)
程序中sql="select * from eg where id="& request("id")期望生成的语句是:select * from eg where id=1这样的形式结果当request("id")取值为 1;drop table eg;这时实际的语句就是:select * from eg where id=1;drop table eg; eg表被删除了
程序中sql="select * from eg where idno='"& request("idno") &"'"期望生成的语句是select * from eg where idno='test'这样的形式结果当request("idno")取值为 test';drop table eg;-- 这时实际的语句就是select * from eg where idno='test';drop table eg;--' eg表被删除了
程序中sql="select * from eg where id in ("& request("id") &")"期望生成的语句是select * from eg where id in (1,2,3)这样的形式结果当request("id")的值为1,2,3);drop table eg;--这时实际的语句就是select * from eg where idno in (1,2,3);drop table eg;--) eg表被删除了
......具体语句不一样构造方法有些差异,但机会都是程序给的

根据语句关键词的特点,很多设置了关键词过滤,这样有些效果,毕竟不能逾越做些意外的操作,但不便是显而易见的,把正常的含有关键词的词汇都列入了黑名单,csdn要是这样搞,都没法用了.而所谓的特殊字符也是根据具体构成来测定的,上面的例2和例3,'和)分别构成了特殊符号.类型检测多在数字类型下可适用,而多数的是非数字.变量长范围也只能局限注入的语句.
所以针对不同的语句和不同的参数获取,防范的具体方式不尽相同.而可确定的是防范了构造的可能就防止了注入.


------解决方案--------------------
引用楼主 yanniu008 的帖子:
SQL注入是什么,我就不用说了,如果你真的不知道你可以去网上搜一下。
防止注入概括起来其实就是
1 类型检查 (检查得到的数据类型是不是符合要求的类型)
2 变量范围检查 (得到的变量的长度都是有个范围的,检查是否符合)
3 特殊字符过滤 (主要就是过滤 , " % 空格等特殊字符)
4 sql关键字过滤 (主要是exec|insert|select|delete|update| truncate |drop|master|SysColumns|SysMembers|sysusers等字符)

发…

------解决方案--------------------
再有会员发布的时候用replace替换就OK了
------解决方案--------------------
比如update 你替换成[update],然后再读出的时候再替换回去

类似这样的替换
------解决方案--------------------
UP,帮顶 ~我一般用过滤
------解决方案--------------------
帮忙顶一下,多给我点分,我要升星星!!!



http://bolm.cn
------解决方案--------------------
探讨
那如果字符的里有特殊字符 我过滤了之后 文章不就是看起来很不协调了 例如:I will update data.
过滤了之后就成了 I will data.

------解决方案--------------------
对不通的语句和获取的参数做策略调整
正常的:
update mytable set mydata='i''ll update data'
没处理的
sql="update mytable set mydata='"& request("mydata") &"'"
参数是i'll update data,这里会报错了;成了
update mytable set mydata='i'll update data'
处理一下
sql="update mytable set mydata='"& replace(request("mydata"),"'","''") &"'"
就好了

正常的
update mytable set mydata='i will update data'
没处理的
sql="update mytable set mydata='"& request("mydata") &"'"
正常的参数i will update data,尝试注入i will update data';drop table mytable;--
没处理的语句就是 update mytable set mydata='i will update data';drop table mytable;--'