1. 程式人生 > >為Web網站新增IP過濾功能實踐總結(C#)

為Web網站新增IP過濾功能實踐總結(C#)

         這項任務是從米老師(米新江的部落格)那裡接手的。目的是給考試系統加上限制,在區域網內,防止同學從考試以外的地點登入。

         過濾IP聽起來比較容易,最終的效果就是驗證一下IP,再決定是否有許可權訪問考試系統。但是要做的好就不那麼容易了。接下來總結一下開發歷程。

         一、工程根基:資料庫設計。

         設計工程首先要從需求開始,需求出介面,介面出資料庫。由於需求比較簡單,我直接設計了資料庫。

         設計資料庫的時候,考慮到IP過濾相當於防火牆,和手機上來電防火牆很相似,順便取其精華了。在IP過濾中,加上規則功能,有三個預定義的規則:不使用、只攔截黑名單、只允許白名單。經過數次的設計改進,最終資料庫結構如下:

         簡要說明一下設計思路:

當前規則表用來存放正在使用的規則,根據規則不同,進行不同的驗證,讀不同的表(黑名單表或者白名單表)

黑名單表、白名單表用來存放被禁止的IP、被允許的IP,僅僅放一個IP。同時支援IP段過濾,比如192.167.25.*。

IP-MAC對應資訊表相當於資訊庫,當某個IP通過了黑白名單的驗證,還要檢查IP和MAC是否對應,因為很可能有人修改了IP來偽造,但這時IP和MAC就不再對應。

最後說明一下,一般要IP和MAC同時驗證,如果只驗證IP,太不安全,區域網內非常容易偽造。如果是外網,只驗證IP就夠了,外網的IP是唯一的。

二、程式碼工之路:嘗試Web獲取訪問者IP、MAC。

在沒有查閱相應技術之前,就隱隱感覺到這是一項艱鉅的任務,因為MAC資訊非常敏感。果然,經過調查,發現在Web端獲取訪問者的IP很容易,但是獲取MAC就幾乎是幻想,因為它太敏感了。

獲取客戶端MAC共有三種方法(只做概述):

l  通過ActiveX控制元件獲取。缺點:只相容IE瀏覽器,而且要把IE瀏覽器的安全性設定的很低,先別說使用者是否同意,微軟第一個不同意,瘋狂的彈出安全警告。優點:速度快,結果準確可靠,內網、外網通用。

l  通過呼叫WindowsAPI基於ARP發包原理獲取。缺點:只能在區域網內使用,外網無效。就算是區域網,網段還要一樣,否則獲取不到。優點:速度快,與瀏覽器無關,相容性好。

l  通過呼叫CMD命令獲取。缺點:速度及其慢,慢的像網頁假死一樣,而且結果不太可靠。優點:瀏覽器無關,相容性好,而且內網、外網均可以使用。

說明一下,以上所有方法都是針對javascript說的,因為只有它是執行在客戶端的。可以看出,以上每種方法的缺點都是致命的,經過分析思考,最終放棄了使用Web獲取訪問者的IP資訊。

         三、程式碼工之路:用客戶端獲取訪問者IP、MAC。

         通過徵求米老師的意見,最終決定用客戶端獲取訪問者IP、MAC。也就是說,使用者想使用考試系統,必須先下載安裝客戶端。這樣設計一來可以很方便的獲取訪問者的IP和MAC,二來可以讓我們更加主動,能更好的控制使用者。

         核心問題:

         這樣做又引出一個新問題:安全問題。由於資訊是由客戶端獲取,然後以引數的形式傳遞給Web網站,這樣很可能被手動偽造。

首先想到的解決方案是對傳遞的引數進行加密,加密以後由於外人不知道加密演算法,無法對引數進行修改、構造。

本來以為這樣就可以了,過了幾天,才突然意識到這樣是不行的。假如A電腦允許訪問網站,而B電腦不允許訪問,那麼A電腦上的客戶端構造的引數是一個有效的引數,B電腦上的客戶端構造的引數是無效引數。如果有人截獲了A電腦上的有效引數,手動複製到B電腦上,那麼B電腦憑藉有效引數可以成功登入系統,我們完全不知道被欺騙了。以上的引數,都是經過加密的,無論怎麼加密,都是徒勞的。

這個問題的中心是如何區分傳遞給Web網站的引數是客戶端構造的,還是手動偽造的。答案是:無法區分!

既然無法區分,可以換另外一個角度。受到網盤下載地址的啟發,可以給客戶端構造的引數加上一個時效。在客戶端生成引數時,加入一個有效期,假設是2秒,Web網站接受引數時,判斷是否過期。引數是加密的,因此外界無法修改引數有效期,除非他知道加密演算法。

這樣一來,手動偽造幾乎不可能,因為引數的有效期僅僅2秒,引數構造、傳遞、接受、有效期判斷等過程基本上就把2秒消耗的差不多了,即使是複製到別處,那時候早就失效了。

Web端職責:

為了使程式儘量靈活,Web端有如下職責:

l  提供規則、黑名單、白名單管理頁面,也就是整個IP過濾系統的後臺控制。

l  提供出錯頁面。諸如:未安裝客戶端、禁止該IP訪問、引數異常等錯誤提示,靈活的顯示在出錯頁面上,並且根據錯誤型別不同,來顯示或隱藏客戶端下載提示。

l  提供IP掃描介面。受到深信服網路監控的啟發,提供掃描模式,只要電腦安裝了客戶端,即可向客戶端傳送命令,讓客戶端訪問掃描介面,自動新增電腦IP-MAC對應資訊到資料庫中,如果存在,則修改,不存在則新增,無需手動干預。

l  提供伺服器時間介面。客戶端構造引數的有效期,必須依賴於伺服器時間。

l  提供客戶端引數介面。客戶端幾乎所有的引數都是從伺服器獲取的,這樣可以更加靈活的控制客戶端,以後有什麼改動,完全不用修改客戶端,達到一次編譯,永久執行。

客戶端職責:

l  從伺服器獲取配置資訊。

l  監視瀏覽器網址。

l  獲取訪問者IP、MAC,構造引數。

簡單的說,客戶端就是按照伺服器的意願辦事。

至此,一個IP過濾功能就完成了。這裡總結的僅僅是理論,程式碼就不貼了。希望大家多多和我交流,互相促進。

最後感謝米老師的大愛