ASP.NET网站制作之.NET情况下增添网站IP过滤功能
在CSDN里搜索一下“初学”两字,竟有三百余篇帖子(也许更多)。有些帖子说,有了asp的基础,只要15天就能很熟悉了,我甚感自己的愚钝。更多帖子是向大家请教初学者适合看书。两个多月的时间(当然平常杂事比较多。华能团体下某发电厂的企业网站(基于Asp.Net2.0完成,不同意修正源程序)请求完成“厂内用户可间接会见全部站点的一切页面,厂外用户只能会见指定的页面”的功效,本文将依照需求剖析、计划计划、编码完成、部署使用的按次慢慢论述全部办理计划的构成历程。华能团体下某发电厂的企业网站(基于Asp.Net2.0完成,不同意修正源程序)请求完成“厂内用户可间接会见全部站点的一切页面,厂外用户只能会见指定的页面”的功效,本文将依照需求剖析、计划计划、编码完成、部署使用的按次慢慢论述全部办理计划的构成历程。1.需求剖析
经由过程深切的交换和相同,确认了该发电厂在企业网站用户会见把持方面的改善请求,大抵情形以下:
a)网站基于Asp.Net2.0完成,不同意修正源程序
b)厂内用户可间接会见全部站点的一切页面,员工不必要身份考证
c)厂外用户只能会见指定的页面
不言而喻,他们就是针对企业网站增添一项IP过滤功效,在厂外用户会见某些敏感页面时将其拒之门外。起首我们必要设置一个IP列表和一个Url列表,前者包括一切厂内IP,后者包括厂外用户可会见的全体Url,而且这两个列表都是可保护的;别的一个中心成绩是,我们必要选择一个公道的体例将开辟好的功效模块集成到企业网站中,HttpModules当仁不让。
在Asp.Net时期,IIS吸收到哀求并将其调剂给aspnet_isapi.dll以后,ASP.NET引擎入手下手逐一对已设置的HTTP模块(HttpModules)举行初始化,然后再挪用准确的HTTP处置程序并出现被哀求的资本,最初将所天生的标志前往给IIS和哀求客户端(以下图所示)。
IIS和ASP.NET正在处置哀求
假如你想懂得更多关于HttpModules的材料,请自行查阅。
2.计划计划
2.1.开辟情况
编程言语:C#2.0
开辟工具:VisualStudio.NET2008
操纵体系:windows2003R2
2.2.提要计划
利用HttpModules完成IP过滤功效的中心头脑是:自界说一个HttpModule捕捉每个用户哀求,然后猎取相干的用户IP和被哀求的Url举行逻辑判别,将未受权的哀求重定向到一个毛病提醒页。Http哀求受权与否的判别逻辑为:
1)判别哀求是不是来自当地盘算机,是则主动疏忽,不然持续;
2)判别用户IP是不是属于内网(IP列表),是则疏忽,不然持续;
3)判别被哀求Url是不是受权一切用户会见,是则疏忽,不然持续;
4)将哀求重定向到毛病提醒页。
在HttpApplication的BeginRequest事务中附加自界说的处置程序便可完成Http哀求的捕捉。别的,为了便于保护我们应将程序运转必要的各项参数(IP列表、Url列表、毛病提醒页路径等等)存储于特定的XML设置文件中,为了进步效力,我们还必要将设置文件实行内存级的缓存处置并对IP、Url婚配算法举行得当的优化。
2.3.设置缓存算法
设置文件的缓存参照微软CommonServer项目中的完成逻辑,将设置信息耐久化为实体类存储于HttpContext.Current.Cache中,设置文件产生后缓存信息将主动清空,下次会见时再次实行耐久化操纵,不需重启站点。本文对CommonServer的缓存逻辑不做深切切磋,感乐趣者可自行搜刮相干材料。
2.4.IP列表算法
经由过程上文可知,以后项目用到的IP列表包括的数据量十分无限,就是电厂web服务器可无效辨认的内网IP的穷举。
因此我们将全部IP列表缓存,利用时间接检索以后用户IP是不是存在于列表当中便可。在详细IP的存储方面,我们可将其视作256进制,将IP字符串转换为数字格局(比方:192.168.10.3可视作192*256*256*256+168*256*256+10*256+3=3232238083,不思索IPV6);在参数设置的格局方面,我们应同时撑持单个IP或IP段的体例增删IP列表。
2.5.Url列表算法
就详细需求而言,Url列表是一个受权外网用户会见的白名单,换个说法,“对外网用户而言除在列表当中的其他都不成会见”,一旦数据的平安级别下降,会不会呈现“对外网用户而言除列表当中的其他都能够会见”的情形呈现呢?为了兼容这类后续场景,我们必要为Url列表界说一个“是不是黑名单”(IsBlacklist)的附加参数;别的,关于静态网站穷举Url明显是不实际的,不论是保护黑名单仍是白名单,以是我们能够变化一下思绪,变动终极Url为正则表达式,即:保护一个可婚配方针Url的正则表达式列表,针对用户哀求的详细Url逐一正则表达式实行婚配操纵,只需有一个婚配乐成则以为以后Url存在于Url列表当中。
3.编码完成
因为本文供应全体的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.cs
xml节点属性读取器
IPMatchEngine.cs
IP婚配引擎
UrlMatchCondition.cs
Url婚配前提(与正则表达式婚配)
UrlMatchEngine.cs
Url婚配引擎
WebsiteFilterHttpModule.cs中BeginRequest自界说处置程序的中心代码以下:
以下为援用的内容:
voidcontext_BeginRequest(objectsender,EventArgse)
{
if(HttpContext.Current.Request.IsLocal)//疏忽当地盘算机哀求
return;
stringip=HttpContext.Current.Request.UserHostAddress;
if(!WebsiteFilterConfiguration.GetConfig().PickedIPs.IsMatch(ip))
{//若在IP列表中找不到访客ip
stringrawUrl=HttpContext.Current.Request.RawUrl;
UrlMatchEnginepu=WebsiteFilterConfiguration.GetConfig().PickedUrls;
//列表包括以后url且列表为黑名单、列表不包括以后url且列表不为黑名单时需转向
//换而言之,“装备了局”与“是不是黑名单”取值分歧时需转向
if(pu.IsMatch(rawUrl)==pu.IsBlacklist)
{//非公然url主动重定向
HttpContext.Current.Response.Redirect(pu.ErrorPage);
}
}
}
4.部署使用
4.1.DotCommonWebsiteFilter.cfg.xml设置文件
设置文件的根节点为DotCommon,一切设置信息均为WebsiteFilter节点的子项。PickedUrl节点对应Url列表,IsBlacklist(1是0否)唆使是不是为黑名单,ErrorPage指定毛病提醒页路径,其子节点add可反复呈现,经由过程pattern属性指定正则表达式文本,上图所示设置暗示仅网站首页(default.aspx)同意外网用户会见。
PickedIP节点对应IP列表,无效子节点包含add、remove、clear三项。以上图为例,第一个add唆使内网ip为192.168.10.1、192.168.10.2、192.168.10.3、192.168.10.4、192.168.10.5五个;到第二行删撤除192.168.10.2、192.168.10.3、192.168.10.4还剩192.168.10.1、192.168.10.5两个;到第三行再增加上192.168.10.3,终极的内网IP列表为192.168.10.1、192.168.10.3、192.168.10.5三个。
4.2.在企业网站中集成
设置好DotCommonWebsiteFilter.cfg.xml中的各项参数并拷贝到网站根目次。
拷贝DotCommon.WebsiteFilter.dll文件到网站bin目次。
在网站根目次下创建与设置文件中绝对应的毛病提醒页(比方sorry.htm)。
修正Web.config在《httpModules》节点下注册WebsiteFilter模块,代码以下:
以下为援用的内容:
<httpModules>
<addname="WebsiteFilter"
type="DotCommon.WebsiteFilterHttpModule,DotCommon.WebsiteFilter"/>
</httpModules>
分离从内网、外网会见企业网站检察运转效果。
停止语
本文仅针对详细需求论述办理计划的构想历程,但愿对读者能有所匡助,接待提出改善定见。
既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。 在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗? ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
页:
[1]