五一節的勞動:ASP.NET的訪問限制功能

來源:互聯網
上載者:User

    五一勞動節放假三天,我也確實勞動了三天,主要的工作就是完成了對網站(http://www.step1.cn)的訪問進行了控制,這個功能我覺得挺必要的,可是我在網上搜尋了很久,也沒有發現相關的東西,無奈只好自己寫了一個,功能雖然不怎麼樣,不過目的達到就行了。

    事情的起因是這樣的:4月最後一天我下載了網站的伺服器端日誌(由於是虛擬機器主機,擷取日誌比較麻煩,因此這個事情不是很經常做),於是從各個方面仔細的分析了一下,其他方面問題不大,最關鍵的是我發現有幾個IP對網站的訪問特別頻繁,分析一下之後,發現其中有幾個是baidu的蜘蛛(說老實話,我也沒有想到百度蜘蛛對網站的訪問如此頻繁),還有幾個不是蜘蛛的就很值得懷疑了。

    首先我到一個可以根據IP反查網域名稱的網站查了一下,結果查出來一些很值得懷疑的網站,其中有一個極為典型,公布出來,大家幫我鄙視一下:(ditu.123175.com/place/cn),(我不想給這個地址加上串連,搞不好給這個垃圾站加上串連影響我的部落格站的信譽度了),該網站多個欄目完全的照抄我的網站內容,並且伺服器一直不停的在我的網站抓取內容,大哥,做點有技術含量的事情好不好?這樣的行為真是……算了不說了,本文依然是技術主題,就不在這個問題上發揮了。

    於是我就要採取措施了,我開始是寫了一個簡單的程式來直接屏蔽該IP,之後又在五一節的三天裡對這個程式進行了完善,,目前該程式大致能滿足我的要求了,因為程式還線上上調試之中,我暫時不會公布代碼,僅僅說一下具體的實現過程和原理:

    1.我的網站基本架構依然是來源於URL重寫機制(很久以前上過我的網站的使用者可能知道,我的網站原先其實就是一個部落格,使用的是部落格園的源碼,後來因為我要發布一些地圖相關的程式,漸漸的將部落格遷移到部落格園,可是我將其中的URL重寫的代碼拆出來保留了),這個機制是通過Web.Config之中的httpHandlers的設定來控制所有的ASP.NET的響應,所有的ASP.NET請求都會被截獲處理。

    2.我在原來的截獲的類之調用一個靜態方法,在這個方法之中,執行請求的統計和限制過程,一旦判斷該請求不合法,就立即返回400(Bad Request)而不繼續執行,因此,一旦請求被限制,就不會返回正常內容了。

    3.由於我是在ASP.NET之中實現的截獲,因此,不會影響靜態內容如htm之類的內容,一來這些內容對伺服器的影響很大,二來這些內容不包含資料,因此不需要加入限制。

    4.我的基礎實現邏輯是這樣的:每個IP每分鐘最多訪問30個ASP.NET頁面,每小時最多訪問600個頁面,每天最多訪問1800個頁面,這是我對網站的目前的訪問情況進行統計之後做出的部署,我覺得這樣是不會影響正常的使用的,當然這些數字都可以在web.config之中配置的。

    5.每當有一個IP訪問之時,我會將這個IP加入到分鐘列表mList,這個列表記錄了當前分鐘範圍內每個IP訪問了多少次了,一旦這個分鐘結束之後,我就將這個分鐘列表按照訪問次數排序,並將前十位的IP加入到小時列表hList(為什麼只要前十位的呢,要避免這個IP列表太大,影響效能),同樣,這個小時結束之後,將這個小時列表的前十位添加到日列表dList。

    6.在添加到列表之後,再分別在3個列表之中檢查該IP的訪問次數是否超出限制,如果是,則返回400錯誤,也就是說,超出每分鐘次數限制的IP在該分鐘結束前禁止訪問,超出每小時次數限制的IP在該小時內禁止訪問。

    7.每次禁止了某次訪問,都要將該次訪問的時間、IP、訪問路徑、UserAgent輸出到日誌,以便觀察是否存在不合理的訪問限制,每次日列表dList的更改(每天24次),都將其內容輸出到記錄檔,以便觀察是否有不正常的現象。

    8.除了以上訪問次數的限制之外,我還順便加入了IP黑名單的限制,一旦加入黑名單,所有的訪問都會被限制,這種情況下,將只能訪問本站的靜態內容,當然這個黑名單也是在web.config之中可以配置的。

    9.最大的問題在於記錄的保持,要知道,我不想用資料庫,因為我做訪問限制的目的之一就是要減少資料庫的壓力,要是這個用資料庫,估計資料庫就要掛了,因此,我開始想的是使用ASP.NET之中的靜態變數,畢竟也就是3個長度不大的list而已,結果,經過線上檢測發現,該資料一定時間之後就會被清空,至今我也不知道問題出在哪兒,開始總是懷疑是自己的程式的問題,研究了好久,後來懷疑到是靜態變數的生命週期的問題,在網上查了一下,好像說有一些大俠不建議使用靜態變數,可是並沒有明確的說會出現什麼問題,網路上大家也差不多都認為Statici變數應該和網站整體生命週期是一樣的,可是我的程式的3個list好像是每隔20分鐘左右就會被清空一次,因此只有分鐘的次數限制能起到作用。

    後來我覺得有可能是虛擬機器主機的問題,我一生氣,就決定每分鐘將3個list的資料使用序列化的方式寫入到檔案之中,然後每次發生資料被清空的時候從檔案裡面去讀,這樣的話損失的記錄肯定不會超過1分鐘,而且正常的重啟服務業不會影響到統計資料了,例如有時候我要更新東西,肯定會要重啟Application的,按照目前的這個寫法,效能雖然會差一點,不過實現的效果還是不錯的。

   以上就是我五一的勞動,就是那些不愛勞動,喜歡不勞而獲的站長同仁們毀了我的3天的勞動節,我想:有盜取別人網站的技術和時間,為什麼不自己寫一些獨特的東西出來呢?我承認我的網站也借鑒過別的網站的內容,可是我從來不願意照抄,因為我要給我的網站一個存在的理由。

    PS:因為別人評論我的網站廣告太多,有點像垃圾站,我正在反省,準備對網站布局進行調整,調整之後,網站廣告將會變少,不會還會存在,而且可能會更加顯眼,以後可能將左側欄擴大為350的寬度(現在是200),因此左側就會存在更大的廣告了,呵呵,不過左側欄的變大主要是因為右側欄被我取消了,而且有一些功能確實需要更大的左側空間來展現。頁面上可能就只存在左側欄的廣告了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.