//Web.config //<httpModules>// <!–Url重寫–>// <add type=”UrlRewriter.RewriterHttpModule, UrlRewriter” name=”UrlRewriter”/>// <!–防類似DDOS攻擊–>// <add type=”UrlRewriter.DDosAttackModule, UrlRewriter” name=”DDosAttackModule”/>// </httpModules> using System;using System.Web;using System.Collections.Generic;using System.Collections.Specialized;using System.Timers; namespace UrlRewriter{ /// <summary> /// 阻止攻擊IP地址的回應 /// </summary> public class DosAttackModule : IHttpModule { void IHttpModule.Dispose() { } void IHttpModule.Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } private static Dictionary<string, short> _IpAdresses = new Dictionary<string, short>(); private static Stack<string> _Banned = new Stack<string>(); private static Timer _Timer = CreateTimer(); private static Timer _BannedTimer = CreateBanningTimer(); private const int BANNED_REQUESTS = 1; //規定時間內訪問的最大次數 private const int REDUCTION_INTERVAL = 1000; // 1 秒(檢查訪問次數的時間段) private const int RELEASE_INTERVAL = 5 * 60 * 1000; // 5 分鐘(清除一個禁止IP的時間段) private void context_BeginRequest(object sender, EventArgs e) { string ip = HttpContext.Current.Request.UserHostAddress; if (_Banned.Contains(ip)) { HttpContext.Current.Response.StatusCode = 403; HttpContext.Current.Response.End(); } CheckIpAddress(ip); } /// <summary> /// 檢查訪問IP /// </summary> private static void CheckIpAddress(string ip) { if (!_IpAdresses.ContainsKey(ip)) //如果沒有當前訪問IP的記錄就將訪問次數設為1 { _IpAdresses[ip] = 1; } else if (_IpAdresses[ip] == BANNED_REQUESTS) //如果當前IP訪問次數等於規定時間段的最大訪問次數就拉於“黑名單” { _Banned.Push(ip); _IpAdresses.Remove(ip); } else //正常訪問就加次數 1 { _IpAdresses[ip]++; } } #region Timers /// <summary> /// 建立計時器,從_IpAddress減去一個請求。 /// </summary> private static Timer CreateTimer() { Timer timer = GetTimer(REDUCTION_INTERVAL); timer.Elapsed += new ElapsedEventHandler(TimerElapsed); return timer; } /// <summary> /// 建立定時器,消除一個禁止的IP地址 /// </summary> /// <returns></returns> private static Timer CreateBanningTimer() { Timer timer = GetTimer(RELEASE_INTERVAL); timer.Elapsed += delegate { _Banned.Pop(); }; //消除一個禁止IP return timer; } /// <summary> /// 建立一個時間器,並啟動它 /// </summary> /// <param name="interval">以毫秒為單位的時間間隔</param> private static Timer GetTimer(int interval) { Timer timer = new Timer(); timer.Interval = interval; timer.Start(); return timer; } /// <summary> /// 減去從集合中的每個IP地址的請求 /// </summary> private static void TimerElapsed(object sender, ElapsedEventArgs e) { foreach (string key in _IpAdresses.Keys) { _IpAdresses[key]--; if (_IpAdresses[key] == 0) _IpAdresses.Remove(key); } } #endregion }}