怎么预防SQL Injection 漏洞利用攻击(四)
>首页 -> 社会专题 -> 硬件网络 2010-07-08 来源: 作者: 【】 浏览:2837

errc=true

end if

next

if errc then

response.write " "

response.end

end if

程序体(5)

我要做点声明的是:以上的程序只是对GET方式提交的数据进行的过滤,千万不要盲目套用。

像其他一些来自 ASP request 对象 (Reques、Request.QueryString、Request.Form、Request.Cookies和 Request.ServerVariables) 的用户输入的攻击方法的方法,大致都集中在脚本期望的输入变量是数字变量 (ID) 上,当然我们不能只看数字变量,比如:

http://127.0.0.1/systembbs/showtopic.asp?tid=99&name=abc' and left(userpasswor

d,1)='a

http://127.0.0.1/systembbs/addtopic.asp?tid=99&name=abc' and userpasswor

d='or''='

另外,如何单一的防止类似这样的注入错误?

http://127.0.0.1/systembbs/addtopic.asp?tid=99' ;delete forum_forum;--&page=33

防范程序: 程序体(6)

......addtopic.asp?action=add......

......addtopic.asp?action=delect......

Action1=trim(Request.QueryString())

if left(action1,7)<>"action=" then '限定querystring必须为 action=

error(err01)'错误处理

else

action=Request.querystring("action")'取得querystring的值

end if

select case action'对querystring进行处理

case "add"

.....

case "delete"

......

case else '如果querystring没有这个值则进行错误处理

error(err02)

end select

程序体(6)

出现这样的攻击,使我们的站长们不得不又再次头痛,这里我可以给出大家一个解决最好办法,一般的来说,用户名长度字符数不会超过15个字符,大都为14字符。那么我们从长度出发,来进行过滤:如程序体(7)

Name=replace(name,"'","")

If len(name)>16 then

Response.write " 你要做什么?"

Response.end

End if

程序体(7)

为什么我们这里以及过滤了单引号,怎么还要再次取一个长度限制呢?不多说了,看看4ngel的文章先<<饶过'限制继续射入>> .别问我怎么转数字格式,我不会,嘿嘿...^_^!

还继续回到我们的主题," 脚本期望的输入变量是数字变量 (ID)".怎样进行注入防范,天呐,方法太多了,最直接的就是判断是否是数字整型,还有一些比较个性的验证办法,我们一一介绍一下 如:程序体(8)

一,判断数字是否是整型

p_lngID = CLng(Request("ID"))

二 取字长 这一点我相信一般的数据长度不会大于8位所以:

If len(ID)>8 then

response.write "bedpost"

response end

end if

三 我认为这是一种比较冒险的办法,就是再进行一次数据库的查询,如果数据库表内没有相同的值与之相同那么返回错误.

sql = "SELECT NAME FROM Category where ID="&ID

set temp=conn.Execute(SQL)

if temp.bof or temp.eof then

response.Redirect("index.asp")

else

cat_name=temp("name")

end if

set temp=nothing

‘上面的是数据ID 的检测,下面则是正式的查询

sql = "SELECT ID T_ID, NAME FROM Category where ID="&ID&" ORDER BY xh asc"

rs.open sql,conn,1,1

四,我自己常用的数据过滤脚本,专利,呵~

id=replace(id,"'","")

If len( request("id"))>8 then ‘ 为什么取长度上面程序中已经说明

response.write " "

response.end

else

If request("id")<>"" then ‘取不为空则是为了防止一些程序页中会出现空值情况,如果不在这里做判断,程序会校验出错.

If IsNumeric(request("id"))=False then ' 风清扬修改 ID数据监控程式

response.write " "

response.end

end if

end if

end if

程序体(8)

由于我个人的编程习惯,我喜欢将所有的数据检验程序全部保留到整站的公用程序中,比如:conn.asp啦,只需要写一次就可以修复全站的问题.

说到这里,我提一点关于攻击的问题,就是跑用户密码或者是用户名,一般常用的就是

....../show.asp?id=1 and 0<>(select count(*) from admin where id=3 and left(username,1)='a')

这样去一个一个尝试,当然我们不能在这里提什么Perl程序去跑密码,程序是别人写,要自己知道原理.这里我只是想给个比较方便的办法就是取ASC码范围.这个要比单独跑要快很多.不论是是字母,数字,汉字,特殊字符,他们总会有对应的ASC码,用以下办法:

....../show.asp?id=1 and 0<>(select count(*) from admin where id=3 and asc(right(left(username

e,3),1)) between 1 and 10000) 剩下的就随你了,一般的从97到122就可以啦,字母嘛,很快D.呵呵,有人想用mid 函数当然也是不错 asc(mid(username,2,1)) between 1 and 10000 也成.

如何更加有效的防止SQL注入攻击?我们将在下面的文章中具体提到!

您看到此篇文章时的感受是:
Tags: 责任编辑:佚名
免责申明: 除原创及很少部分因网文图片遗失而补存外,本站不存储任何有版权的内容。你看到的文章和信息及网址索引均由机器采集自互联网,由于时间不同,内容可能完全不同,请勿拿本网内容及网址索引用于交易及作为事实依据,仅限参考,不会自行判断者请勿接受本站信息,本网转载,并不意味着赞同其观点或证实其内容的真实性.如涉及版权等问题,请立即联系管理员,我们会予以更改或删除,保证您的权利.对使用本网站信息和服务所引起的后果,本网站不作任何承诺.
首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论:0条】 【关闭】 【返回顶部
微信分享二维码

打开微信扫一扫分享

上一篇网管如何保护在网络上传输的个人.. 下一篇windows7/8升级win10卡在32%造成..
密码: (新用户注册)

最新文章

图片主题

热门文章

推荐文章

相关文章

便民服务

手机扫描

空间赞助

快速互动

论坛互动
讨论留言

有事联系

有哪个那个什么的,赶紧点这里给DOVE发消息

统计联系

MAIL:gnlt@Dovechina.com
正在线上:1

版权与建议

任何你想说的