使用带有Application_BeginRequest的HttpModule,如何仅检查第一个请求?

时间:2011-02-08 14:17:44

标签: asp.net httpmodule

我正在使用以下HttpModule来阻止一些不断尝试向我的联系表单发送垃圾邮件的IP。我没有收到垃圾邮件,因为它们触发System.Web.HttpRequestValidationException,但我确实在我的电子邮件收件箱中收到了异常报告。它不是那么烦人,而是差不多。

我最终想要测试数据库中的IP列表,或者实现HttpBL api来测试已知的黑名单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 个答案:

答案 0 :(得分:3)

HTTP是无状态的,因此,您确实必须检查每个请求。您可以缓存IP地址的黑名单,这样您就不必每次都加载它,但是您仍然需要始终运行某些测试。

如果您可以控制它,另一个选项是对您的路由器进行一些过滤。这将使你的代码免于必须这样做。