C# 通过 HTTPModule 防范 DOS

摘要:
直接上代码:publicclassDosAttackModule:IHttpModule{voidIHttpModule.Dispose(){}voidIHttpModule.Init(HttpApplicationcontext){context.BeginRequest+=newEventHandler(context_BeginRequest);}privatestaticDictionar

直接上代码:

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。。

免责声明:文章转载自《C# 通过 HTTPModule 防范 DOS》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux下mysql的安装与使用MFC修改窗口无标题和标题信息,修改执执行文件图标下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PE 学习之路 —— DOS 头、NT 头

1. 前述 可执行文件的格式是操作系统本身执行机制的反映,理解它有助于对操作系统的深刻理解,掌握可执行文件的数据结构及其一些机理,是研究软件安全的必修课。`PE(Portable Executable File Format)`是目前 windows 平台上的主流可执行文件格式。PE 文件衍生于早期的 COFF 文件格式,描述 PE 格式及 COFF 文件...

telnet 查看端口是否可访问

  1. 首先为什么要写这篇文章   说到为什么还得从DNS服务器说起。我在我的电脑上安装了DNS服务器,但是用网络去访问还怎么都访问都不上去。于是我就打开dos窗口,用ping命令查看是否可以ping(如 ping 125.34.49.211)通。一查能够ping通。既然可以通,那么就说明这个地址是有效的,那问题出现在那边呢,只能出现在访问的端口po...

【摘】在Window下右键方式打开Dos命令窗口右键菜单支持DOS命令提示符号

在使用Dos命令时,我们必须通过命令cmd/command来打开dos窗口,再切换到运行目录,频繁的切换使人非常的厌烦,我们可以通过修改注册表来快速的切换到运行目录。在“开始”-“运行”中输入“regedit”,打开注册表。找到\HKEY_CLASSES_ROOT\Folder\shell,如果没有shell,可以在Folder下新建一个名为shell的键...

Vi快捷操作 vim配置【shell文件格式从windows转换为linux】

vim配置 http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html gg 首行 dd 删除当前行 :.,$d  删除全部内容 :set number 显示行号 SHELL syntax error:unexpected end of file 提示错误 DOS下文件和Linux下文件格式差...

windows server系统查看tomcat版本

线上服务器系统是windows server版本,由于tomcat进行了apache httpd集群,所以对tomcat进行了统一编号: 在jprofiler中需要监听一个server实例,需要先搞清楚tomcat版本,但是从tomcat命名上看看不出来。 百度一下,说找到tomcat目录下bin目录下,有version.bat 和version.sh两...

8086汇编语言(1)虚拟机安装ms-dos 7.1

8086汇编语言(1)虚拟机安装ms-dos 7.1 文/玄魂 前言 在开始这一系列文章之前,我想先说下,对于古董级的8086汇编到底还以有没有学习的必要。这里我说下我要从8086开始学习,而不是从win32汇编或者win64汇编直接开始学习的理由。 开发技术越是上层,高级,那么对底层封装的就越深。我学习汇编语言的目的,不是用它来开发应用软件,因为那是高...