مسدود کردن آدرس IP با استفاده از IHttpModule در Asp.Net
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

 باسلام:
هدف این مقاله بیشتر آشنایی با HttpModule در قالب یک پروژه می‌باشد. 
قصد دارم در این مقاله یک روش برای مسدود کردن IP هایی که به هر روشی در سایت شما اقداماتی غیر عادی انجام دادن و شما قصد دارید سایت شما به اونها نمایش داده نشه بیان کنم.
دقت کنید که شما میتونید با تشخیص کاربر متخلف مثل کاربری که بیش از 5 بار اقدام به وارد کردن نام کاربری و رمز عبور کرده کنید و IP کاربر رو در جایی مانند DataBase ذخیره کنید و یک زمان براش ثبت کنید و تا 15 دقیقه بعد از اون دسترسی به سایت رو ازش بگیرید.
برای شروع من کلاس مربوطه رو  با نام IPBlockModule در پوشه App_Code میسازم:
 
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public class IPBlockModule : IHttpModule
{
       public IPBlockModule()
       {
              // TODO: Add constructor logic here
       }
    public void Dispose()
    {
        //Dispose
    }
 
    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(Application_BeginRequest);
    }
 
    private void Application_BeginRequest(object source, EventArgs e)
    {
        HttpContext context = ((HttpApplication)source).Context;
        string ipAddress = context.Request.UserHostAddress;
        if (IsBlockedIpAddress(ipAddress))
        {
            context.Response.StatusCode = 403;
            context.Response.Write("Forbidden : The server understood the request, but It is refusing to fulfill it.");
        }
    }
 
    private bool IsBlockedIpAddress(string ipAddress)
    {
        //Here I have stored Ip addresses in String[]. you can also Store in database.
        string[] IPs = {            "117.196.35.121",
                                    "117.196.35.122",
                                    "117.196.35.123",
                                    "117.196.35.124",
                                    "127.0.0.1"
                       };
 
        foreach(string IP in IPs)
        {
            if(IP == ipAddress)
                return true;
        }
        return false;
   
    }
    
}
و در فایل web.config این کلاس رو اضافه میکنیم :
 <configuration>
       <system.web>
              <compilation debug="true" targetFramework="4.0"/>
              <httpModules>
                     <add name="IPBlockModule" type="IPBlockModule"/>
              </httpModules>
       </system.web>
</configuration>
میتونید متغیر آرایه ای IPs رو از پایگاه داده بخونید و کوئری رو با شرط مدت زمان سپری شده که معمولا 15 دقیقه هست بگیرید.

موفق باشید. 
  • #
    ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۰۳:۰۰
    سلام. با تشکر از شما.
    بسیار مطلب خوب و کاربردی بود.
    در همین رابطه مطلب خوبی در اینجا  خوانده بودم که برای مطالعه بیشتر پیشنهاد می‌کنم.
    همچنین متد IsBlockedIpAddress را می‌توان با عبارت LINQ زیر جایگزین کرد:
    private static bool IsBlockedIpAddress(string ipAddress)
            {
                string[] ips = {
                                   "117.196.35.121",
                                   "117.196.35.122",
                                   "117.196.35.123",
                                   "117.196.35.124",
                                   "127.0.0.1"
                               };
    
                return ips.Any(ip => ip == ipAddress);
            }
    • #
      ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۱۶:۴۸
      باسلام:
      باتشکر از شما دوست گرامی.
      یک نکته رو توجه داشته باشید که راه‌ها و روش‌های زیادی برای پیاده سازی وجود داره من خودم سعی میکنم ساده‌ترین روش رو برای پیاده سازی متد‌ها انتخاب کنم و هر برنامه نویسی میتونه اونو بسته به معماری که ازش استفاده میکنه تغییر بده.
      راه‌های رسیدن به خدا زیاده.
  • #
    ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۰۳:۰۵

    سلام دوست عزیز

    آیا بلاک کردن ip کار دقیقی است؟ از این نظر که ده‌ها نفر در اینترنت ممکن است با یک ip به سایت ما وصل بشن و این کار باعث میشه همه اونا بلاک بشن

    • #
      ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۰۳:۱۳
      محدودیت زمانی 15 دقیقه را برای همین منظور اعمال می‌کنند.
    • #
      ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۱۶:۴۶
      باسلام:
      میشه گفت یک راه برای جلوگیری از هکرها میباشد هکرها میتونه هم انسان باشه و یا هم یک برنامه کاربردی (روبوت) که یک عملیات رو در یک بازه زمانی زیاد تست میکنه. 
      که این بحث در این مورد در اینجا نمیگنجه و بیشتر من در این مقاله هدفم استفاده از HTTP Module بود.
      موفق باشید.
  • #
    ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۲۱:۲۹
    از این نمونه‌ها من در این سایت زیاد دارم. کسانی که مرتبا روزی چند بار سایت رو زیر حمله می‌گیرند.


    • #
      ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۲۱:۳۲
      شما برای جلوگیری از این IP‌ها کاری میکنید؟
      • #
        ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۲۱:۳۵
        بله. یک فیلتر آنتی داس درست کردم که شبانه روز دسترسی این نوع مزاحم‌ها رو حذف می‌کنه. تا الان هر روز به طور میانگین حداقل 2 بار در زمان‌های مختلف به این سایت حمله شده.
        • #
          ‫۱۲ سال و ۳ ماه قبل، دوشنبه ۲۶ تیر ۱۳۹۱، ساعت ۲۱:۳۷
          اگر در قالب یک مقاله ارائه بدید خیلی مفید واقع میشه.
          باتشکر.
          • #
            ‫۱۲ سال و ۳ ماه قبل، سه‌شنبه ۲۷ تیر ۱۳۹۱، ساعت ۱۴:۵۲
            تقریبا بر همین اساس پیاده سازی شده. اطلاعات در کش سیستم ذخیره می‌شن و به این ترتیب IPهای مهاجم رو میشه تشخیص داد.
            • #
              ‫۱۲ سال و ۲ ماه قبل، دوشنبه ۱۶ مرداد ۱۳۹۱، ساعت ۱۴:۵۳
              مهندس نصیری من IP هایی که به نحوی دارن بازدید اضافی انجام میدن و مشکوک هستن طبق همین روش اونارو توی لیست سیاه میذارم و دسترسی اونهارو به سایت قطع می‌کنم آیا روش درستیه؟
              یعنی دیگه نمی‌تونن بیان توی سایت اما این امکان گذاشتم که بعدا اونهارو از لیست سیاه در بیارم
              • #
                ‫۱۲ سال و ۲ ماه قبل، دوشنبه ۱۶ مرداد ۱۳۹۱، ساعت ۱۸:۲۷
                نه. IPهای کاربران در ایران عموما ثابت نیست. نصف روز بسته شود کافی است.
  • #
    ‫۱۲ سال و ۳ ماه قبل، سه‌شنبه ۲۷ تیر ۱۳۹۱، ساعت ۱۸:۵۶

    با درود و عرض ادب

    استاد نصیری

    سایت ما هر چتد وقت یک بار با ip‌های مختلفی هک می‌شود

    همه جور محدودیت و enjection هم اعمال کردم.

    به نظرتون این مشکل رو چی کار باید کرد.؟

    ممنون از راهنمایی تون

    • #
      ‫۱۲ سال و ۳ ماه قبل، سه‌شنبه ۲۷ تیر ۱۳۹۱، ساعت ۱۸:۵۹
      نمیشه همینطوری ندیده اظهار نظر کرد. نیاز به code review داره.
    • #
      ‫۱۲ سال و ۳ ماه قبل، سه‌شنبه ۲۷ تیر ۱۳۹۱، ساعت ۱۹:۴۹
      سلام
      البته توی این آدرس به فارسی توضیح داده شده همون روش
  • #
    ‫۶ سال و ۴ ماه قبل، دوشنبه ۱۰ اردیبهشت ۱۳۹۷، ساعت ۱۳:۴۷
    معادل این مطلب در برنامه‌های ASP.NET Core

    ابتدا بسته‌ی نیوگت DNTCommon.Web.Core را نصب کنید:
    PM> Install-Package DNTCommon.Web.Core
    سپس میان افزار AntiDos آن‌را به صورت زیر می‌توانید استفاده و تنظیم کنید:
    الف) آن‌را پیش از هر میان‌افزار دیگری ثبت کنید:
    public void Configure(IApplicationBuilder app)
    {
      app.UseAntiDos();
    ب) تنظیمات مخصوص آن‌را به فایل appsettings.json اضافه کنید.
    ج) این تنظیمات را به صورت زیر به برنامه معرفی کنید:
    public void ConfigureServices(IServiceCollection services)
    {
       services.Configure<AntiDosConfig>(options => Configuration.GetSection("AntiDosConfig").Bind(options));
    این میان‌افزار هم یک فایروال است که می‌تواند یک رنج‌آی‌پی را ببندد و هم می‌تواند کلاینت‌ها را بر اساس user agent و همچنین هدرهای خاصی فیلتر کند. به علاوه در آن می‌توانید تنظیم کنید که یک کاربر در هر دقیقه چندبار می‌تواند درخواستی را به سمت سایت ارسال کند و پس از آن تا مدتی دسترسی آن به سایت قطع شود.