开发者社区> 老朱教授> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

通过HttpModule实现IP地址屏蔽功能

简介:
+关注继续查看

此前本想在网上找找实现Asp.Net的IP地址屏蔽功能的文章来参考,但是一搜索“IP 屏蔽 asp.net”,出现的全都是:

image

image这些都是对我此前写的《细说Asp.net的IP地址屏蔽功能设计》一文的无情转载,不仅不保留出处、作者,而且连标题都没一个与我原文相同的~~

这篇文章写的是程序设计部分,并没有编程实现屏蔽功能,搜索引擎上翻了几页也没找到个正经写这方面的文章,无奈只好自己来研究实现,并写下此文的续篇了,倒是没什么难度。

 

本文将介绍通过实现IHttpModule接口,进行判断和屏蔽IP地址的方法。

(HttoModule的基础知识可以参阅这里:http://www.tracefact.net/Asp-Net/Introduction-to-Http-Module.aspx

阅读前请先参阅《细说Asp.net的IP地址屏蔽功能设计》一文,本文将使用这篇文章中提出的思路,并将使用文中创建的数据库、实体类。

 

首先,新建一个类,名为IPFilter,继承自IHttpModule接口:

image 

实现IHttpModule接口,并为context对象的AcquireRequestState事件添加事件处理:

image

(因为我们要用到Session,而在早于AcquireRequestState的事件中Session还未被初始化。参考于:http://www.cnblogs.com/junqilian/archive/2008/03/07/1095454.html

事件处理方法:

image

这里的主要功能是从Session中读取用户IP,再从缓存中读取IP地址屏蔽列表,遍历IP地址屏蔽数据,判断是否应当屏蔽当前IP,如果判断为屏蔽,就关闭输出,让客户端无法访问。

黄色高亮区域:这里是在判断Session是否为空,其原因是不能保证执行到这里时Session总是存在的,我曾在有异步访问的页面中遇到过这里报错的情况,所以这样处理比较稳妥。

绿色高亮区域:这是在《细说Asp.net的IP地址屏蔽功能设计》一文中提供的实体类方法。

蓝色高亮区域:辅助方法,其代码见下文:

image

 

此方法用于获取IP地址。

image

此方法用于从数据库中读取有效的IP地址屏蔽数据,并将其装入缓存。

缓存时间设置为固定3分钟。

至此,过滤类就实现了。

 

接下来还需要向Web.Config文件中注册此HttpModule处理程序:

image

这样就全部完成了。

 

屏蔽测试:

image

添加IP屏蔽数据后3分钟内(依据缓存时间设置),被屏蔽的访问者继续浏览网站就会出现这样的提示了。

 

源代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Net;

 

namespace MySite

{

    public class IPFilter : IHttpModule

    {

        void context_AcquireRequestState(object sender, EventArgs e)

        {

            var c = (sender as HttpApplication).Context;

            if (c.Session == nullreturn;

            IPAddress ip = null;

            if (c.Session["IP"== null)

            {

                c.Session["IP"= ip = IPAddress.Parse(获取客户端IP地址(c));

            }

            else ip = c.Session["IP"as IPAddress;

            if (c.Cache["IPFilter"== null更新IP屏蔽列表缓存();

            var l = c.Cache["IPFilter"as List<IP地址屏蔽>;

            foreach (var f in l)

            {

                if (f.检测是否被屏蔽(ip))

                {

                    c.Response.Close();

                    break;

                }

            }

        }

 

        void 更新IP屏蔽列表缓存()

        {

            using (var c = new DatabaseEntities())

            {

                var iplist = c.IP地址屏蔽.Where(f => f.过期时间 > DateTime.Now).ToList();

                HttpContext.Current.Cache.Insert("IPFilter",

                    iplist,

                    null,

                    DateTime.Now.AddMinutes(3),

                    System.Web.Caching.Cache.NoSlidingExpiration,

                    System.Web.Caching.CacheItemPriority.AboveNormal,

                    null);

            }

        }

 

        /// <summary>

        /// 获得当前页面客户端的IP

        /// </summary>

        public static string 获取客户端IP地址(HttpContext c)

        {

            string result = String.Empty;

 

            result = c.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (string.IsNullOrEmpty(result))

            {

                result = c.Request.ServerVariables["REMOTE_ADDR"];

            }

 

            if (string.IsNullOrEmpty(result))

            {

                result = c.Request.UserHostAddress;

            }

 

            if (string.IsNullOrEmpty(result))

            {

                return "0.0.0.0";

            }

 

            return result;

        }

 

        #region IHttpModule 成员

 

        public void Dispose()

        {

 

        }

 

        public void Init(HttpApplication context)

        {

            context.AcquireRequestState += new EventHandler(context_AcquireRequestState);

        }

 

        #endregion

    }

}

 

 

 

总结来说没什么难度,但是因为这段代码在每次请求中都会执行一次,所以对性能要求很高,如果你有什么优化方面的建议,欢迎提出。

 

 

 

下载本文的XPS版本:

image


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2009/07/31/1535569.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C# 基于SharpPcap的局域网数据包捕获 之二 监听代码
C# 基于SharpPcap的局域网数据包捕获 之二 监听代码 1.配置好sharpPcap引用和安装好winPcap后,添加引用 using PacketDotNet; using SharpPcap; using SharpPcap.AirPcap; using SharpPcap.LibPcap; using SharpPcap.WinPcap; 2.获取网卡,至于为什么会有两个注释掉的获取网卡方法。
1468 0
如何屏蔽某IP地址访问网站
最近发现网站恶意攻击频率较高,登录服务器管理后台,发现某些IP持续性地恶意访问我的站点,而且都是一些不存在的页面或文件。很显然这些访问请求不正常,所以就研究了下如何屏蔽掉某IP或IP段访问站点。
1226 0
网站屏蔽指定ip
修改.htaccess文件   Order Deny,Allow     //开启屏蔽Deny from 124.64.242.117  //要屏蔽的ip
576 0
Sikuli进行IP地址及掩码的设置
要进行IP设置需要进行很多步骤,现在可以用Sikulii进行编程,让其自动完成操作,脚本为  
562 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载