Используя HttpModule с Application_BeginRequest, как проверить только первый запрос? - PullRequest
3 голосов
/ 08 февраля 2011

Я использую следующий HttpModule, чтобы остановить пару IP-адресов, которые постоянно пытаются спамить мою контактную форму.Я не получаю спам, поскольку они вызывают System.Web.HttpRequestValidationException, но я получаю отчет об исключении в своем почтовом ящике.Это не так раздражает, но почти.

В конечном итоге я хочу протестировать либо список IP-адресов из базы данных, либо, возможно, реализовать API-интерфейс HttpBL для тестирования известных IP-адресов из черного списка, но выполнение этого при каждом запросе представляется излишним,В любом случае я делаю это, будь то использование IP-адресов в базе данных или отправка запросов во внешний черный список при каждом запросе страницы, безусловно, кажется ненужным.Можете ли вы указать мне направление проверки один раз, и если IP проходит тест в первый раз, чтобы прекратить проверку?

using System;
using System.Web;

namespace DomainModel.Services
{
    public class BlockIPModule : IHttpModule
    {
        public void Dispose() {}

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(Application_BeginRequest);
        }

        private void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext context = ((HttpApplication)sender).Context;
            string currentIP = context.Request.UserHostAddress;
            if (!IsIpValid(currentIP))
            {
                context.Response.StatusCode = 403; 
            }
        }

        private bool IsIpValid(string checkIP)
        {
            return (checkIP != "213.5.70.205" && checkIP != "188.92.75.82");
        }

    }
}

обновленный код удален - ужасная идея.

1 Ответ

3 голосов
/ 08 февраля 2011

HTTP не имеет состояния, и поэтому вам действительно нужно проверять каждый запрос. Вы можете кэшировать черный список IP-адресов, чтобы вам не приходилось каждый раз загружать его, но вам все равно нужно всегда запускать some test.

Если у вас есть контроль над этим, другой вариант будет сделать некоторую фильтрацию на вашем маршрутизаторе. Это освободило бы ваш код от необходимости делать это.

...