طراحی یک ماژول IpBlocker در ASP.NET MVC
نویسنده: احمد نواصری
تاریخ: ۱۳۹۵/۰۱/۰۴ ۲۱:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
private enum VisiteType
{
FirstVisite = 2,
Reviste = 4,
} if (httpContext.Cache[ipAddress] != null)
{
hits++;
if (hits == (int)VisiteType.FirstVisite)
{
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddSeconds(1),
slidingExpiration: Cache.NoSlidingExpiration);
return;
} using System;
using System.Net;
using System.Web;
using System.Web.Caching;
namespace IpBlocker
{
public class IpBlocker : IHttpModule
{
private int hits = 0;
/// <summary>
/// Define enum to specify visite type
/// </summary>
private enum VisiteType
{
FirstVisite = 2,
Reviste = 4,
}
public void Init(HttpApplication context)
{
context.BeginRequest += OnBeginRequest;
}
public void Dispose()
{
}
public void OnBeginRequest(object sender, EventArgs e)
{
var httpApplication = sender as HttpApplication;
var httpContext = httpApplication?.Context;
ProcessRequest(httpApplication, httpContext);
}
private void ProcessRequest(HttpApplication application, HttpContext httpContext)
{
//Checke if browser is a search engine web crawler
if (httpContext.Request.Browser.Crawler)
return;
var ipAddress = application.Context.Request.UserHostAddress;
if (httpContext.Cache[ipAddress] == null)
{
// Reset hits for new request after blocking ip
if (hits > 0)
hits = 0;
hits++;
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddSeconds(1),
slidingExpiration: Cache.NoSlidingExpiration);
return;
}
else
{
if (httpContext.Cache[ipAddress] != null)
{
hits++;
if (hits == (int)VisiteType.FirstVisite)
{
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddSeconds(1),
slidingExpiration: Cache.NoSlidingExpiration);
return;
}
if (hits == (int)VisiteType.Reviste)
{
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddSeconds(1),
slidingExpiration: Cache.NoSlidingExpiration);
return;
}
if (hits > (int)VisiteType.Reviste)
{
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddMinutes(1),
slidingExpiration: Cache.NoSlidingExpiration);
httpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
httpContext.Response.SuppressContent = true;
httpContext.Response.End();
}
}
}
}
}
} PM> Install-Package DNTCommon.Web.Core
public void Configure(IApplicationBuilder app)
{
app.UseAntiDos(); public void ConfigureServices(IServiceCollection services)
{
services.Configure<AntiDosConfig>(options => Configuration.GetSection("AntiDosConfig").Bind(options));
"DurationMin": 1, "AllowedRequests": 100,
warn: DNTCommon.Web.Core.AntiDosFirewall[0]
Banned IP: $10.45.142.75, UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36. RequestsCount: 21, ExpiresAt: 9/18/18 9:42:17 AM +00:00, Reason: IsDosAttack