asp.net防类似DDOS攻击(CC攻击)代码
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 } }
转自:
http://blog.wuaiwei.com/2011/04/02/asp-neté²ç±»ä¼¼ddosæ»å»ä»£ç /#more-118
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2009-04-11 ASP 0104 : 80004005解决方法,更改iis上传文件大小限制