技术开发 频道

ASP.NET性能提升之Membership表和阻止DOS攻击

  使用 一个名为IsValid的static方法用来进行检查。如果请求限制没有通过,则返回true。如果请求需要被决绝,则返回false。一旦你获得false,你就可以调用Request.End ()方法并阻止ASP.NET进行未来的处理。你可以切换显示了“Congratulations! You have succeeded in Denial of Service Attack.”的页面。

public static bool IsValid( ActionTypeEnum actionType )
{
   HttpContext context
= HttpContext.Current;
  
if( context.Request.Browser.Crawler ) return false;
  
  
string key = actionType.ToString() + context.Request.UserHostAddress;
   var hit
= (HitInfo)(context.Cache[key] ?? new HitInfo());
    
  
if( hit.Hits > (int)actionType ) return false;
  
else hit.Hits ++;
    
  
if( hit.Hits == 1 )
      context.Cache.Add(key, hit,
null, DateTime.Now.AddMinutes(DURATION),
         System.Web.Caching.Cache.NoSlidingExpiration,
         System.Web.Caching.CacheItemPriority.Normal,
null);
  
return true;
}

  内置的缓存键将活动类型和客户端IP地址进行了合并。首先它检查是否有针对活动的任何入口和存储于缓存中的客户端IP。如果没有,开始计数并记住指定持续时间内缓存中的IP。缓存项中的绝对期满日期确保缓存项在持续一段时间后能够被清除并重新计算。当在缓存中已经存在一个入口时,获得最后的点击数,并检查是否超越了该限制。如果没有超过,则增加计数器。

  不需要通过Cache[url]=hit的方式存储更新后的值到缓存中;因为点击对象是一个引用对象,改变它意味着在缓存中它也要改变。事实上,如果你再次将它放入缓存中,缓存期满计数器将重新开始并在指定持续时期后导致失败逻辑重新计算。

  用法十分简单, default.Aspx页面上的代码如下: 

protected override void OnInit(EventArgs e)
{
   base.OnInit(e);

  
// Check if revisit is valid or not
  
if( !base.IsPostBack )
   {
      
// Block cookie less visit attempts
      
if( Profile.IsFirstVisit )
      {
        
if( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.FirstVisit))  
            Response.
End();
  }
      
else
      {
        
if( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.ReVisit) )  
            Response.
End();
      }
   }
  
else
   {
      
// Limit number of postbacks
      
if( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Postback) )
            Response.
End();
   }
}

  这里我对具体的场景如访问、再次访问、回发等进行检查。

  当然你可以通过放置一些Cisco的防火墙来阻止DOS攻击。这样你就可以避免主机提供商的整个网络不会因为受到DOS或者DDOS攻击的影响。这些所能保证的只是网络级别的攻击,诸如TCP SYN攻击、奇怪的数据报文分组等。在没有cookie或者试图加载太多widgets的情况下, 他们没有办法能够分析这些报文并找出一个特殊的IP来试图多次加载站点。这些都被称为应用程序级别的DOS攻击,硬件不能对其进行阻止。这些必须在你自己的代码中进行实现处理。

  现在几乎很少有站点采用这种预防措施来防止遭受这种应用程序级别的DOS攻击。因此可以非常容易地编写一些简单的代码从宽带连接中通过持续点击站点上这些耗费昂贵的页面或者进行Web服务调用来使得服务器崩溃。我希望这对你来说只是一个小问题,并可以采用这种有效的方式帮助你阻止自己Web应用程序遭受DOS攻击。

  小结 
       
  你已经学到了很多技巧来应付在具有相同硬件配置的机器上使得ASP.NET的性能发挥到极致。你也学到了如何使用一些AJAX技术来使得你的站点加载更快更流畅。最后,你学到了如何防御站点因高点击量所带来的风险以及扩展静态内容跨过内容传输网络来抵御站点高峰期引起的阻塞。所有这些技术都可以使你的站点加载速度更快,运行得更流畅,以及以更低的成本获得更高的负载量。

0
相关文章