2011-02-08 42 views
2

我正在使用以下HttpModule来停止一些IP,这些IP会不断尝试发送我的联系表单。我没有收到垃圾邮件,因为它们触发了System.Web.HttpRequestValidationException,但我在我的电子邮件收件箱中收到了异常报告。这不是很烦人,但几乎。在Application_BeginRequest中使用HttpModule,如何仅检查第一个请求?

我最终希望根据数据库中的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"); 
     } 

    } 
} 

更新的代码删除 - 糟糕的想法。

回答

3

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

如果你有控制权,另一个选择是在你的路由器上做一些过滤。这将使您的代码免于执行。

+0

我明白了,但是如果这个IP通过了,没有理由再次测试它。至少不在本届会议期间。我认为缓存结果比缓存黑名单更有意义。好主意,谢谢! :) – mark123 2011-02-08 14:25:37

相关问题