ASP.NET環(huán)境下為網(wǎng)站增加IP過濾功能
2.3. 配置緩存算法
配置文件的緩存參照微軟CommonServer項(xiàng)目中的實(shí)現(xiàn)邏輯,將配置信息持久化為實(shí)體類存儲(chǔ)于HttpContext.Current.Cache中,配置文件發(fā)生后緩存信息將自動(dòng)清空,下次訪問時(shí)再次執(zhí)行持久化操作,不需重啟站點(diǎn)。本文對(duì)CommonServer的緩存邏輯不做深入探討,感興趣者可自行搜索相關(guān)資料。
2.4. IP列表算法
通過上文可知,當(dāng)前項(xiàng)目用到的IP列表包含的數(shù)據(jù)量非常有限,就是電廠web服務(wù)器可有效識(shí)別的內(nèi)網(wǎng)IP的窮舉。
因而我們將整個(gè)IP列表緩存,使用時(shí)直接檢索當(dāng)前用戶IP是否存在于列表之中即可。在具體IP的存儲(chǔ)方面,我們可將其視作256進(jìn)制,將IP字符串轉(zhuǎn)換為數(shù)字格式(例如:192.168.10.3可視作192*256*256*256+168*256*256+10*256+3=3232238083,不考慮IPV6);在參數(shù)配置的格式方面,我們應(yīng)同時(shí)支持單個(gè)IP或IP段的方式增刪IP列表。
2.5. Url列表算法
就具體需求而言,Url列表是一個(gè)授權(quán)外網(wǎng)用戶訪問的白名單,換個(gè)說法,“對(duì)外網(wǎng)用戶而言除了在列表之中的其他都不可訪問”,一旦數(shù)據(jù)的安全級(jí)別降低,會(huì)不會(huì)出現(xiàn)“對(duì)外網(wǎng)用戶而言除了列表之中的其他都可以訪問”的情況出現(xiàn)呢?為了兼容這種后續(xù)場景,我們需要為Url列表定義一個(gè)“是否黑名單”(IsBlacklist)的附加參數(shù);另外,對(duì)于動(dòng)態(tài)網(wǎng)站窮舉Url顯然是不現(xiàn)實(shí)的,不管是維護(hù)黑名單還是白名單,所以我們可以轉(zhuǎn)變一下思路,更改最終Url為正則表達(dá)式,即:維護(hù)一個(gè)可匹配目標(biāo)Url的正則表達(dá)式列表,針對(duì)用戶請(qǐng)求的具體Url逐個(gè)正則表達(dá)式執(zhí)行匹配操作,只要有一個(gè)匹配成功則認(rèn)為當(dāng)前Url存在于Url列表之中。
3. 編碼實(shí)現(xiàn)
由于本文提供全部的c#源碼下載,所以本節(jié)僅對(duì)源碼壓縮包中的主要文件進(jìn)行簡要說明:
以下為引用的內(nèi)容: DotCommon.WebsiteFilter │ DotCommonWebsiteFilter.cfg.xml │ WebsiteFilterConfiguration.cs │ WebsiteFilterHttpModule.cs ├─Util │ GlobesCache.cs │ XmlAttributeReader.cs └─WebsiteFilter IPMatchEngine.cs UrlMatchCondition.cs UrlMatchEngine.cs |
DotCommonWebsiteFilter.cfg.xml
運(yùn)行參數(shù)配置文件
WebsiteFilterConfiguration.cs
配置文件實(shí)體類
WebsiteFilterHttpModule.cs
實(shí)現(xiàn)了System.Web.IHttpModule接口的自定義Http模塊
GlobesCache.cs
全局緩存操控類
XmlAttributeReader.cs
xml節(jié)點(diǎn)屬性讀取器
IPMatchEngine.cs
IP匹配引擎
UrlMatchCondition.cs
Url匹配條件(與正則表達(dá)式匹配)
UrlMatchEngine.cs
Url匹配引擎
WebsiteFilterHttpModule.cs中BeginRequest自定義處理程序的核心代碼如下:
以下為引用的內(nèi)容: void context_BeginRequest(object sender, EventArgs e) { if (HttpContext.Current.Request.IsLocal)//忽略本地計(jì)算機(jī)請(qǐng)求 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; //列表包含當(dāng)前url且列表為黑名單、列表不包含當(dāng)前url且列表不為黑名單 時(shí)需轉(zhuǎn)向 //換而言之,“配備結(jié)果”與“是否黑名單”取值一致時(shí)需轉(zhuǎn)向 if (pu.IsMatch(rawUrl) == pu.IsBlacklist) { //非公開url自動(dòng)重定向 HttpContext.Current.Response.Redirect(pu.ErrorPage); } } } |
4. 部署應(yīng)用
4.1. DotCommonWebsiteFilter.cfg.xml配置文件
配置文件的根節(jié)點(diǎn)為DotCommon,所有配置信息均為WebsiteFilter節(jié)點(diǎn)的子項(xiàng)。PickedUrl節(jié)點(diǎn)對(duì)應(yīng)Url列表,IsBlacklist(1是0否)指示是否為黑名單,ErrorPage指定錯(cuò)誤提示頁路徑,其子節(jié)點(diǎn)add可重復(fù)出現(xiàn),通過pattern屬性指定正則表達(dá)式文本,上圖所示配置表示僅網(wǎng)站首頁(default.aspx)允許外網(wǎng)用戶訪問。
PickedIP節(jié)點(diǎn)對(duì)應(yīng)IP列表,有效子節(jié)點(diǎn)包括add、remove、clear三項(xiàng)。以上圖為例,第一個(gè)add指示內(nèi)網(wǎng)ip為192.168.10.1、192.168.10.2、192.168.10.3、192.168.10.4、192.168.10.5五個(gè);到第二行刪除掉192.168.10.2、192.168.10.3、192.168.10.4還剩192.168.10.1、192.168.10.5兩個(gè);到第三行再添加上192.168.10.3,最終的內(nèi)網(wǎng)IP列表為192.168.10.1、192.168.10.3、192.168.10.5三個(gè)。
4.2. 在企業(yè)網(wǎng)站中集成
配置好DotCommonWebsiteFilter.cfg.xml中的各項(xiàng)參數(shù)并拷貝到網(wǎng)站根目錄。
拷貝DotCommon.WebsiteFilter.dll文件到網(wǎng)站bin目錄。
在網(wǎng)站根目錄下建立與配置文件中相對(duì)應(yīng)的錯(cuò)誤提示頁(例如sorry.htm)。
修改Web.config在《httpModules》節(jié)點(diǎn)下注冊WebsiteFilter模塊,代碼如下:
以下為引用的內(nèi)容: <httpModules> <add name="WebsiteFilter" type="DotCommon.WebsiteFilterHttpModule, DotCommon.WebsiteFilter"/> </httpModules> |
分別從內(nèi)網(wǎng)、外網(wǎng)訪問企業(yè)網(wǎng)站查看運(yùn)行效果。
相關(guān)文章
解決AJAX.NET中的懸停panel在頁面加載時(shí)閃爍的問題
AJAX.NET的兩個(gè)懸停控件.分別是HoverMenuExtender和ModalPopupExtender.他們可以打造很好的懸停效果...通常,我都是用panel來作為懸停內(nèi)容的容器..2009-06-06一步步打造簡單的MVC電商網(wǎng)站BooksStore(3)
這篇文章主要和大家一起一步步打造一個(gè)簡單的MVC電商網(wǎng)站,MVC電商網(wǎng)站BooksStore第三篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04ASP.NET MVC實(shí)現(xiàn)橫向展示購物車
這篇文章介紹了ASP.NET MVC實(shí)現(xiàn)橫向展示購物車的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09asp.net 參數(shù)不同共用一個(gè)頁面的實(shí)現(xiàn)方法
本文為大家介紹下asp.net參數(shù)不同如何共用一個(gè)頁面,感興趣的朋友不要錯(cuò)過2013-12-12.NET截取指定長度漢字超出部分以"..."代替 實(shí)例分享
.NET截取指定長度漢字超出部分以"..."代替 實(shí)例分享,需要的朋友可以參考一下2013-06-06.net core并發(fā)請(qǐng)求發(fā)送HttpWebRequest的坑解決
這篇文章主要給大家介紹了關(guān)于.net core并發(fā)請(qǐng)求發(fā)送HttpWebRequest的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-12-12ASP.NET連接SQL數(shù)據(jù)庫的簡單實(shí)例代碼
這篇文章介紹了ASP.NET連接SQL數(shù)據(jù)庫的簡單實(shí)例代碼,有需要的朋友可以參考一下2013-07-07.NET Core Dapper操作mysql數(shù)據(jù)庫的實(shí)現(xiàn)方法
這篇文章主要介紹了.NET Core Dapper操作mysql數(shù)據(jù)庫的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04