日志 教程
当前位置: 教程  >  游戏开发  >  网页游戏开发  >  正文

性能瓶颈诊断与初步调优2

作者:王姿 发表于 2011/2/21 10:34:11     评论(0)     阅读(5045)     

  网络刮刀(Scrapers)与Dos

  这个问题必须引起重视。如果我们的站点上面有很多的有用的信息,那么别人可能就可能开发一个程序来到我们的站点抓取信息,然后把这些内容放到自己的站点上面。例如,很多的内容型的站点每天都从博客园的首页上面来抓取信息,然后放到他们的站点上,增加他们的访问量。

  本来站点被搜索引擎抓就有点消耗性能了,如果还被很多的这样的网络刮刀来抓内容,对站点的性能影响可想而知。

  如果那些网络刮刀程序的的IP地址变化不频繁,而且请求我们站点的频率比较的由规律,那么我们就可以采用一些代码的方式来防止这样的请求。例如,我们可以监测:同一个IP是否在20min之内发送了100个请求,如果是,我们就推测:可能是别人在抓我们的站点内容,我们就拒绝这个IP的请求。

  当然了,上面只是一些简单的方法,对于一些复杂的Dos攻击,上面的监测代码基本没有作用。因为Dos攻击中,攻击的IP地址是变化的。

  下面我们就写一些代码来防止简单的网络刮刀程序和简单的Dos攻击。基本的思想就是:如果在给定的时间段内,如果某个用户的请求很多,超过了一定的数量,那么我们就认为这个”用户”可能是网络刮刀程序,然后就拒绝下面的请求,一段时间之后,再次允许这个从这个IP发出的请求。

  下面的代码中:假设如果一个用户在5秒之内发出了100个请求,那么我们就认为这是网络刮刀程序或者是网站的攻击者。当然,我们还考虑这个发送请求的”用户”是否是搜索引擎的蜘蛛程序。(下面的代码只是简单作为演示,不是实际生产的代码,抛砖引玉)

  private const int intervalSeconds = 30;

  private const int maxRequestsInInterval = 5;

  如果认为这个”用户”是攻击者,那么我们就阻止用户的请求,阻止时间是20秒

  private const int blockedPeriodSeconds = 20;

  下面,我们创建一个类来描述一个访问者的信息。如下:

  代码

  private class VisitorInfo

  {

  public int nbrHits;

  public bool blocked;

  public VisitorInfo()

  {

  nbrHits = 1;

  blocked = false;

  }

  }

  在BotDefence类中加入一个方法IsBotAttach来判断一个请求是否是攻击性的请求。如下:

  代码

  public static bool IsDosAttack()

  {

  string visitorIP = HttpContext.Current.Request.UserHostAddress;

  VisitorInfo visitorInfo = (VisitorInfo)HttpContext.Current.Cache[visitorIP];

  if (visitorInfo == null)

  {

  HttpContext.Current.Cache.Insert(

  visitorIP, new VisitorInfo(), null,

  DateTime.Now.AddSeconds(intervalSeconds),

  System.Web.Caching.Cache.NoSlidingExpiration);

  }

  else

  {

  if (visitorInfo.blocked)

  {

  return true;

  }

  visitorInfo.nbrHits++;

  if (visitorInfo.nbrHits > maxRequestsInInterval)

  {

  visitorInfo.blocked = true;

  HttpContext.Current.Cache.Insert(

  visitorIP, visitorInfo, null,

  DateTime.Now.AddSeconds(blockedPeriodSeconds),

  System.Web.Caching.Cache.NoSlidingExpiration);

  return true;

  }

  }

  return false;

  }

  上面的代码都是自解释的,很容易看懂,就不赘述了。

  当然了,上面的代码很简单,我们可以保存每个请求IP的地址,然后分析。相关的方法网络上面有很多,大家自己找!

  本篇就到这里了。下一章就详细的讲述如何解决内存的性能瓶颈,敬请关注。

评论
显示
悄悄话
汇众教育官网 | 联系方式 | 版权声明 | 友情链接
Copyright 2008© 汇众益智(北京)教育科技有限公司. All Rights Reserved
')京ICP备09092043号 京公网安备11010802009023号