C# 通过 HTTPModule 防范 DOS
直接上代码:
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 }
这个前提是客户端没有使用动态代理IP。。
>更多相关文章
- 09-26多线程开发中线程数量设计问题
- 09-26Go语言和Java、Python等其他语言的对比分析
- 09-26Java语言为什么经久不衰?且总能霸占编程语言排行榜首?
- 09-26浅谈10个提升应用程序10倍性能的技巧
- 06-10利用Python语言判断狗狗年龄的程序
- 12-09用c写了个后台扫描
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 11-01京东七鲜与前置仓完成融合
- 11-01美团外卖推出食安三大举措:抵制违规经营,
- 11-01微软:Windows 10将于2025年终止支持,建议
- 10-29同程旅行回应酒店订单“订后即焚” 将考虑是
- 10-29阿里国际站发布全流程AI产品 推进更高效经营
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御