知识大全 在.NET环境下为网站增加IP过滤功能

Posted

篇首语:人起心发,树起根发。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在.NET环境下为网站增加IP过滤功能相关的知识,希望对你有一定的参考价值。

在.NET环境下为网站增加IP过滤功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  摘要 华能集团下某发电厂的企业网站(基于Asp Net 实现 不允许修改源程序)要求实现 厂内用户可直接访问整个站点的所有页面 厂外用户只能访问指定的页面 的功能 本文将按照需求分析 方案设计 编码实现 部署应用的顺序逐步阐述整个解决方案的形成过程

       需求分析通过深入的交流和沟通 确认了该发电厂在企业网站用户访问控制方面的改进要求 大致情况如下 a)    网站基于Asp Net 实现 不允许修改源程序b)    厂内用户可直接访问整个站点的所有页面 员工不需要身份验证c)    厂外用户只能访问指定的页面 

  显而易见 他们就是针对企业网站增加一项IP过滤功能 在厂外用户访问某些敏感页面时将其拒之门外 首先我们需要设置一个IP列表和一个Url列表 前者包含所有厂内IP 后者包含厂外用户可访问的全部Url 并且这两个列表都是可维护的 另外一个核心问题是 我们需要选择一个合理的方式将开发好的功能模块集成到企业网站中 HttpModules义不容辞

  在Asp Net时代 IIS 接收到请求并将其调度给 aspnet_isapi dll之后 ASP NET 引擎开始逐个对已配置的HTTP模块(HttpModules)进行初始化 然后再调用正确的HTTP处理程序并呈现被请求的资源 最后将所生成的标记返回给 IIS 和请求客户端(如下图所示)

  IIS 和 ASP NET 正在处理请求如果你想了解更多关于HttpModules的资料 请自行查阅

       方案设计     开发环境编程语言 C# 开发工具 Visual Studio NET 操作系统 windows R

       概要设计使用HttpModules实现IP过滤功能的核心思想是 自定义一个HttpModule捕获每一个用户请求 然后获取相关的用户IP和被请求的Url进行逻辑判断 将未授权的请求重定向到一个错误提示页 Http请求授权与否的判断逻辑为 )    判断请求是否来自本地计算机 是则自动忽略 否则继续 )    判断用户IP是否属于内网(IP列表) 是则忽略 否则继续 )    判断被请求Url是否授权所有用户访问 是则忽略 否则继续 )    将请求重定向到错误提示页

  在HttpApplication的BeginRequest事件中附加自定义的处理程序即可完成Http请求的捕获 此外 为了便于维护我们应将程序运行需要的各项参数(IP列表 Url列表 错误提示页路径等等)存储于特定的XML配置文件中 为了提高效率 我们还需要将配置文件执行内存级的缓存处理并对IP Url匹配算法进行适当的优化

       配置缓存算法配置文件的缓存参照微软CommonServer项目中的实现逻辑 将配置信息持久化为实体类存储于HttpContext Current Cache中 配置文件发生后缓存信息将自动清空 下次访问时再次执行持久化操作

  不需重启站点 本文对CommonServer的缓存逻辑不做深入探讨 感兴趣者可自行搜索相关资料

       IP列表算法通过上文可知 当前项目用到的IP列表包含的数据量非常有限 就是电厂web服务器可有效识别的内网IP的穷举

  因而我们将整个IP列表缓存 使用时直接检索当前用户IP是否存在于列表之中即可 在具体IP的存储方面 我们可将其视作 进制 将IP字符串转换为数字格式(例如 可视作 * * * + * * + * + = 不考虑IPV ) 在参数配置的格式方面 我们应同时支持单个IP或IP段的方式增删IP列表

       Url列表算法就具体需求而言 Url列表是一个授权外网用户访问的白名单 换个说法 对外网用户而言除了在列表之中的其他都不可访问 一旦数据的安全级别降低 会不会出现 对外网用户而言除了列表之中的其他都可以访问 的情况出现呢?为了兼容这种后续场景 我们需要为Url列表定义一个 是否黑名单 (IsBlacklist)的附加参数 另外 对于动态网站穷举Url显然是不现实的 不管是维护黑名单还是白名单 所以我们可以转变一下思路 更改最终Url为正则表达式 即 维护一个可匹配目标Url的正则表达式列表 针对用户请求的具体Url逐个正则表达式执行匹配操作 只要有一个匹配成功则认为当前Url存在于Url列表之中

       编码实现由于本文提供全部的c#源码下载 所以本节仅对源码压缩包中的主要文件进行简要说明  

  DotCommon WebsiteFilter│  DotCommonWebsiteFilter cfg xml│  WebsiteFilterConfiguration cs│  WebsiteFilterHttpModule cs ├─Util│      GlobesCache cs│      XmlAttributeReader cs └─WebsiteFilter        IPMatchEngine cs        UrlMatchCondition cs        UrlMatchEngine cs 

  ?    DotCommonWebsiteFilter cfg xml运行参数配置文件 ?    WebsiteFilterConfiguration cs配置文件实体类 ?    WebsiteFilterHttpModule cs实现了System Web IHttpModule接口的自定义Http模块 ?    GlobesCache cs全局缓存操控类 ?    XmlAttributeReader csxml节点属性读取器 ?    IPMatchEngine csIP匹配引擎 ?    UrlMatchCondition csUrl匹配条件(与正则表达式匹配) ?    UrlMatchEngine csUrl匹配引擎  WebsiteFilterHttpModule cs中BeginRequest自定义处理程序的核心代码如下  

  void context_BeginRequest(object sender EventArgs e)                    if (HttpContext Current Request IsLocal)//忽略本地计算机请求                return;            string ip = HttpContext Current Request UserHostAddress;            if (!WebsiteFilterConfiguration GetConfig() PickedIPs IsMatch(ip))               //若在IP列表中找不到访客ip                                string rawUrl = HttpContext Current Request RawUrl;                UrlMatchEngine pu = WebsiteFilterConfiguration GetConfig() PickedUrls;                //列表包含当前url且列表为黑名单 列表不包含当前url且列表不为黑名单  时需转向                //换而言之 配备结果 与 是否黑名单 取值一致时需转向                if (pu IsMatch(rawUrl) == pu IsBlacklist)                   //非公开url自动重定向                    HttpContext Current Response Redirect(pu ErrorPage);                                

       部署应用     DotCommonWebsiteFilter cfg xml配置文件

  配置文件的根节点为DotCommon 所有配置信息均为WebsiteFilter节点的子项 PickedUrl节点对应Url列表 IsBlacklist( 是 否)指示是否为黑名单 ErrorPage指定错误提示页路径 其子节点add可重复出现

  通过pattern属性指定正则表达式文本 上图所示配置表示仅网站首页(default aspx)允许外网用户访问

  PickedIP节点对应IP列表 有效子节点包括add remove clear三项 以上图为例 第一个add指示内网ip为 五个 到第二行删除掉 还剩 两个 到第三行再添加上 最终的内网IP列表为 三个

       在企业网站中集成配置好DotCommonWebsiteFilter cfg xml中的各项参数并拷贝到网站根目录 拷贝DotCommon WebsiteFilter dll文件到网站bin目录 在网站根目录下建立与配置文件中相对应的错误提示页(例如) 修改nfig在<Modules>节点下注册WebsiteFilter模块 代码如下

  <Modules>   <add name= WebsiteFilter       type= DotCommon WebsiteFilterHttpModule DotCommon WebsiteFilter /></Modules>分别从内网 外网访问企业网站查看运行效果 结束语

cha138/Article/program/net/201311/13977

相关参考

知识大全 Asp.net设计IP地址屏蔽功能教程

Asp.net设计IP地址屏蔽功能教程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    于安全

知识大全 Java设置代理IP访问网站

Java设置代理IP访问网站  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  源码  import

知识大全 在开发中.net类库中发送电子邮件[1]

  发送电子邮件是许多需要用户注册的网站的通用功能通过正则表达式我们可以过滤掉不符合电子邮件格式的输入但是仍没有办法确保用户填写的电子邮件地址一定是他本人真实有效的电子邮件地址通常验证电子邮件真实有效

知识大全 ASP.NET MVC自定义过滤属性实现log功能

ASP.NETMVC自定义过滤属性实现log功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 我在主机屋上申请了免费虚拟主机,想上传网站代码,但我不知道我的主机IP地址是什么,怎么找

我在主机屋上申请了免费虚拟主机,想上传网站代码,但我不知道我的主机IP地址是什么,怎么找?  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发

知识大全 .NET中取得IP/用户名等信息常用方法

.NET中取得IP/用户名等信息常用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在NET

知识大全 .NET中获取电脑名、IP及用户名方法

.NET中获取电脑名、IP及用户名方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在NET中获取

知识大全 .NET中获取电脑名、IP地址及用户名方法

.NET中获取电脑名、IP地址及用户名方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在NE

知识大全 Asp.net获取客户端IP常见代码存在的伪造IP问题探讨

Asp.net获取客户端IP常见代码存在的伪造IP问题探讨  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 asp.net获取URL和IP地址

asp.net获取URL和IP地址  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  获取URL: