我这个博客采用了zblog构架,数据库是自己由官方提供的access版本转成的mssql版本,没有做过查询优化,但比起access版本,执行效率已经高了许多。照理说,一个日志页面纯静态化的网站不可能占用系统资源达80%之多!为了更精确的找到存在问题的页面,我使用了一个小程序,这个程序是我在别处花了200大洋购买的,采用isapi技术嵌入iis,可以即时显示当前网站页面访问记录。通过这个软件,我们可以看到,catalog.asp这个文件执行效率特别低,在下图中可以看到这个页面经常发生假死情况。

大家注意一下202.105.139.74这个ip,在这个截图里,这个ip在不到1分钟内,造成了9次的页面假死,分析一下这是什么情况。
很明显,这是一次小规模的拒绝服务攻击,对方选择了catalog.asp这个页面做为入口。
catalog.asp源代码的内容部分的写法
If ArtList.ExportByMixed(Request.QueryString("page"),Request.QueryString("cate"),Request.QueryString("auth"),Request.QueryString("date"),Request.QueryString("tags"),ZC_DISPLAY_MODE_ALL) Then
ArtList.Build
Response.Write ArtList.html
End If
不得不说,zblog的代码写的非常优秀,优秀到堪称经典,但对于这种前台经常会用到的,且频繁查询数据库的,执行时间超过500ms的程序,zblog忘记了一件很关键的事--对同一用户一定时间内请求该页面的限制。
事实上,拒绝服务攻击一旦形成足够的势力,不是软件所能抵御的了的,但现在的情况是:人家一个IP就让我的服务器差点当掉。
这是什么样的一种境界……
于是赶紧放下手头的事,给catalog.asp加上一段代码
Dim ClientIP
ClientIP=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If ClientIP="" Or Isnull(ClientIP) Then ClientIP=Request.ServerVariables("REMOTE_ADDR")
If Session("ClientIP")=ClientIP And DateDiff("s",Session("ClientTime"),Now())<10 Then
response.write "请不要持续刷新本页面"
response.end
End If
Session("ClientIP")=ClientIP
Session("ClientTime")=Now()
上传后服务器压力大减,再在iis中将这个ip拒绝,OK,搞定。
所以从今天开始,打开我的catalog.asp页的时候10秒内不要频繁刷新哦,否则可能被我当成恶意访客挡在网站大门之外。
10分钟后的新发现
202.105.139.74这个ip据查询属于广东省深圳市 迅雷网络技术公司
汗流浃背:难道是迅雷的蜘蛛!!!
不管怎样,catalog.asp这个低效的多用途的页面应该加上一段禁止重复请求的代码。
附上这个神奇的IP的相关:
