首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > ASP >

浅析SQL注入解决办法

2012-05-02 
浅析SQL注入SQL注入是什么,我就不用说了,如果你真的不知道你可以去网上搜一下。防止注入概括起来其实就是1

浅析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;--'


处理一下
sql="update mytable set mydata='"& replace(request("mydata"),"'","''") &"'"
语句就是update mytable set mydata='i will update data'';drop table mytable;--'
没有安全问题了.
这种情况只需要把'替换成两个''就好了.

当然用adodb.recordset的方法或存储过程这种情况就不存在了.

情况比较多,很难穷举说明.






[解决办法]
我滴神哪,从来没想过SQL注入这个问题
今天学到东西了
UP
希望高手继续DING
[解决办法]
曾经是受害者,花了半天才搞定。
[解决办法]
根据你的程序来判断,如果获取参数是数字的话,就判断是否数字。就不需要转换数据库的关键字。
如果是字符型的就用replace来转换关键字。单引号,%号等。
[解决办法]
顶一个了
[解决办法]
记号 and jf
[解决办法]
该注意到的都被你写的差不多了(我想的),
顶一下,留给后来人吧
[解决办法]
1.过滤不能太严格了,不然很多东西都显示不正常。
2.可以考虑URL重写,把前台显示的页面都加多虑。
[解决办法]
参数查询

给分吧
[解决办法]
感觉15楼的不错
[解决办法]
21楼 不错
[解决办法]

探讨
对不通的语句和获取的参数做策略调整
正常的:
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…

[解决办法]
恩,学习
[解决办法]
呵 不懂帮顶 向LZ学习......
[解决办法]
现在终于觉得ASP体力不支了!先不去前台,一个小于15个的录入项,我要写半个多小时的服器端验证,不知谁有好的验证类
[解决办法]
探讨
引用:
对不通的语句和获取的参数做策略调整
正常的:
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"),"'","''") &"'"
就好了

正常的
up…

[解决办法]
探讨
现在终于觉得ASP体力不支了!先不去前台,一个小于15个的录入项,我要写半个多小时的服器端验证,不知谁有好的验证类

[解决办法]
良好的编程习惯才是解决注入的良方!
[解决办法]
eeee 顶
[解决办法]

参数查询

JF
------解决方案--------------------


Public Function GetStrNum(Str)
If Len(Str)<=0 Then Exit Function
For i=0 To Len(Str)
oTemp = Mid(Str,i+1,1)
If IsNumeric(oTemp) Then
GetStrAllNum=GetStrAllNum&oTemp
End If
Next
GetStrNum=GetStrAllNum
End Function

热点排行
Bad Request.