将 HttpModule 与 Application_BeginRequest 一起使用,如何仅检查第一个请求?

mar*_*123 5 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");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

删除了更新的代码 - 糟糕的主意。

Jac*_*cob 4

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

如果您可以控制它,另一个选择是在路由器上进行一些过滤。这将使您的代码不必这样做。