直接上代码:
publicclassDosAttackModule:IHttpModule { voidIHttpModule.Dispose(){} voidIHttpModule.Init(HttpApplicationcontext) { context.BeginRequest+=newEventHandler(context_BeginRequest); } privatestaticDictionary<string,short>_IpAdresses=newDictionary<string,short>(); privatestaticStack<string>_Banned=newStack<string>(); privatestaticTimer_Timer=CreateTimer(); privatestaticTimer_BannedTimer=CreateBanningTimer(); privateconstintBANNED_REQUESTS=1;//规定时间内访问的最大次数 privateconstintREDUCTION_INTERVAL=1000;//1秒(检查访问次数的时间段) privateconstintRELEASE_INTERVAL=5*60*1000;//5分钟(清除一个禁止IP的时间段) privatevoidcontext_BeginRequest(objectsender,EventArgse) { stringip=HttpContext.Current.Request.UserHostAddress; if(_Banned.Contains(ip)) { HttpContext.Current.Response.StatusCode=403; HttpContext.Current.Response.End(); } CheckIpAddress(ip); } ///<summary> ///检查访问IP ///</summary> privatestaticvoidCheckIpAddress(stringip) { if(!_IpAdresses.ContainsKey(ip))//如果没有当前访问IP的记录就将访问次数设为1 { _IpAdresses[ip]=1; } elseif(_IpAdresses[ip]==BANNED_REQUESTS)//如果当前IP访问次数等于规定时间段的最大访问次数就拉于“黑名单” { _Banned.Push(ip); _IpAdresses.Remove(ip); } else//正常访问就加次数1 { _IpAdresses[ip]++; } } #regionTimers ///<summary> ///创建计时器,从_IpAddress减去一个请求。 ///</summary> privatestaticTimerCreateTimer() { Timertimer=GetTimer(REDUCTION_INTERVAL); timer.Elapsed+=newElapsedEventHandler(TimerElapsed); returntimer; } ///<summary> ///创建定时器,消除一个禁止的IP地址 ///</summary> ///<returns></returns> privatestaticTimerCreateBanningTimer() { Timertimer=GetTimer(RELEASE_INTERVAL); timer.Elapsed+=delegate{_Banned.Pop();};//消除一个禁止IP returntimer; } ///<summary> ///创建一个时间器,并启动它 ///</summary> ///<paramname="interval">以毫秒为单位的时间间隔</param> privatestaticTimerGetTimer(intinterval) { Timertimer=newTimer(); timer.Interval=interval; timer.Start(); returntimer; } ///<summary> ///减去从集合中的每个IP地址的请求 ///</summary> privatestaticvoidTimerElapsed(objectsender,ElapsedEventArgse) { foreach(stringkeyin_IpAdresses.Keys) { _IpAdresses[key]--; if(_IpAdresses[key]==0) _IpAdresses.Remove(key); } } #endregion }
这个前提是客户端没有使用动态代理IP。。