IT貓撲網:您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉貼|軟件發(fā)布

您當前所在位置: 首頁網絡編程.Net編程 → 在.NET環(huán)境下為網站增加IP過濾功能

在.NET環(huán)境下為網站增加IP過濾功能

時間:2015-06-28 00:00:00 來源:IT貓撲網 作者:網管聯盟 我要評論(1)

華能集團下某發(fā)電廠的企業(yè)網站(基于Asp.Net2.0實現,不允許修改源程序)要求實現"廠內用戶可直接訪問整個站點的所有頁面,廠外用戶只能訪問指定的頁面"的功能,本文將按照需求分析、方案設計、編碼實現、部署應用的順序逐步闡述整個解決方案的形成過程。

1. 需求分析

通過深入的交流和溝通,確認了該發(fā)電廠在企業(yè)網站用戶訪問控制方面的改進要求,大致情況如下:

a) 網站基于Asp.Net2.0實現,不允許修改源程序

b) 廠內用戶可直接訪問整個站點的所有頁面,員工不需要身份驗證

c) 廠外用戶只能訪問指定的頁面

顯而易見,他們就是針對企業(yè)網站增加一項IP過濾功能,在廠外用戶訪問某些敏感頁面時將其拒之門外。首先我們需要設置一個IP列表和一個Url列表,前者包含所有廠內IP,后者包含廠外用戶可訪問的全部Url,并且這兩個列表都是可維護的;另外一個核心問題是,我們需要選擇一個合理的方式將開發(fā)好的功能模塊集成到企業(yè)網站中,HttpModules義不容辭。

在Asp.Net時代,IIS 接收到請求并將其調度給 aspnet_isapi.dll之后,ASP.NET 引擎開始逐個對已配置的HTTP模塊(HttpModules)進行初始化,然后再調用正確的HTTP處理程序并呈現被請求的資源,最后將所生成的標記返回給 IIS 和請求客戶端(如下圖所示)。

IIS 和 ASP.NET 正在處理請求

如果你想了解更多關于HttpModules的資料,請自行查閱。

2. 方案設計

2.1. 開發(fā)環(huán)境

編程語言:C#2.0

開發(fā)工具:Visual Studio.NET2008

操作系統(tǒng):windows2003 R2

2.2. 概要設計

使用HttpModules實現IP過濾功能的核心思想是:自定義一個HttpModule捕獲每一個用戶請求,然后獲取相關的用戶IP和被請求的Url進行邏輯判斷,將未授權的請求重定向到一個錯誤提示頁。Http請求授權與否的判斷邏輯為:

1) 判斷請求是否來自本地計算機,是則自動忽略,否則繼續(xù);

2) 判斷用戶IP是否屬于內網(IP列表),是則忽略,否則繼續(xù);

3) 判斷被請求Url是否授權所有用戶訪問,是則忽略,否則繼續(xù);

4) 將請求重定向到錯誤提示頁。

在HttpApplication的BeginRequest事件中附加自定義的處理程序即可完成Http請求的捕獲。此外,為了便于維護我們應將程序運行需要的各項參數(IP列表、Url列表、錯誤提示頁路徑等等)存儲于特定的XML配置文件中,為了提高效率,我們還需要將配置文件執(zhí)行內存級的緩存處理并對IP、Url匹配算法進行適當的優(yōu)化。

2.3. 配置緩存算法

配置文件的緩存參照微軟CommonServer項目中的實現邏輯,將配置信息持久化為實體類存儲于HttpContext.Current.Cache中,配置文件發(fā)生后緩存信息將自動清空,下次訪問時再次執(zhí)行持久化操作,不需重啟站點。本文對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列表是一個授權外網用戶訪問的白名單,換個說法,"對外網用戶而言除了在列表之中的其他都不可訪問",一旦數據的安全級別降低,會不會出現"對外網用戶而言除了列表之中的其他都可以訪問"的情況出現呢?為了兼容這種后續(xù)場景,我們需要為Url列表定義一個"是否黑名單"(IsBlacklist)的附加參數;另外,對于動態(tài)網站窮舉Url顯然是不現實的,不管是維護黑名單還是白名單,所以我們可以轉變一下思路,更改最終Url為正則表達式,即:維護一個可匹配目標Url的正則表達式列表,針對用戶請求的具體Url逐個正則表達式執(zhí)行匹配操作,只要有一個匹配成功則認為當前Url存在于Url列表之中。

#p#副標題#e#

3. 編碼實現

由于本文提供全部的c#源碼下載,所以本節(jié)僅對源碼壓縮包中的主要文件進行簡要說明:

以下為引用的內容:
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節(jié)點屬性讀取器

IPMatchEngine.cs

IP匹配引擎

UrlMatchCondition.cs

Url匹配條件(與正則表達式匹配)

UrlMatchEngine.cs

Url匹配引擎

WebsiteFilterHttpModule.cs中BeginRequest自定義處理程序的核心代碼如下:

<noframes id="i6qzy">
<button id="i6qzy"></button>
    以下為引用的內容:
    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;
    ?

    關鍵詞標簽:.NET

    相關閱讀

    文章評論
    發(fā)表評論

    熱門文章 誅仙3飛升任務怎么做-誅仙3飛升任務流程最新2022 誅仙3飛升任務怎么做-誅仙3飛升任務流程最新2022 鐘離圣遺物推薦-原神鐘離圣遺物詞條 鐘離圣遺物推薦-原神鐘離圣遺物詞條 解決方法:應用程序“DEFAULT WEB SITE”中的服務器錯誤 解決方法:應用程序“DEFAULT WEB SITE”中的服務器錯誤 使用aspnet_regiis.exe 重新注冊.NET Framework 使用aspnet_regiis.exe 重新注冊.NET Framework

    相關下載

      人氣排行 誅仙3飛升任務怎么做-誅仙3飛升任務流程最新2022 asp.net表單提交方法GET\POST 在ASP.NET中如何判斷用戶IE瀏覽器的版本 Asp.net中messagebox的實現方法 Asp.net中的web.config配置 在ASP.NET MVC中實現大文件異步上傳 asp.net獲取URL和IP地址 FileUpload上傳多文件出現錯誤的解決方法