C# 站點IP訪問頻率限制 針對單個站點

来源:http://www.cnblogs.com/Supperlitt/archive/2016/04/27/5438524.html
-Advertisement-
Play Games

0x00 前言 寫網站的時候,或多或少會遇到,登錄,註冊等操作,有時候,為了防止別人批量進行操作,不得不做出一些限制IP的操作(當前也可以用於限制某個賬號的密碼校驗等)。 這樣的簡單限制,我們又不想對數據進行存庫(顯得過於浪費資源了)。所以就誕生了0x01中提到的,簡單IP限制類。 0x01 正文 ...


0x00 前言

  寫網站的時候,或多或少會遇到,登錄,註冊等操作,有時候,為了防止別人批量進行操作,不得不做出一些限制IP的操作(當前也可以用於限制某個賬號的密碼校驗等)。

這樣的簡單限制,我們又不想對數據進行存庫(顯得過於浪費資源了)。所以就誕生了0x01中提到的,簡單IP限制類。

0x01 正文

  理論說多了,終究是理論,分享一下代碼

  1 /// <summary>
  2     /// IP訪問頻率控制器
  3     /// </summary>
  4     public class IPCacheManager
  5     {
  6         /// <summary>
  7         /// IP緩存集合
  8         /// </summary>
  9         private static List<IPCacheInfo> dataList = new List<IPCacheInfo>();
 10         private static object lockObj = new object();
 11 
 12         /// <summary>
 13         /// 一段時間內,最大請求次數,必須大於等於1
 14         /// </summary>
 15         private static int maxTimes = 3;
 16 
 17         /// <summary>
 18         /// 一段時間長度(單位秒),必須大於等於1
 19         /// </summary>
 20         private static int partSecond = 30;
 21 
 22         /// <summary>
 23         /// 請求被拒絕是否加入請求次數
 24         /// </summary>
 25         private static bool isFailAddIn = false;
 26 
 27         static IPCacheManager()
 28         {
 29         }
 30 
 31         /// <summary>
 32         /// 設置時間,預設maxTimes=3, partSecond=30
 33         /// </summary>
 34         /// <param name="_maxTimes">最大請求次數</param>
 35         /// <param name="_partSecond">請求單位時間</param>
 36         public static void SetTime(int _maxTimes, int _partSecond)
 37         {
 38             maxTimes = _maxTimes;
 39             partSecond = _partSecond;
 40         }
 41 
 42         /// <summary>
 43         /// 檢測一段時間內,IP的請求次數是否可以繼續請求
 44         /// 和使用
 45         /// </summary>
 46         /// <param name="ip"></param>
 47         /// <returns></returns>
 48         public static bool CheckIsAble(string ip)
 49         {
 50             lock (lockObj)
 51             {
 52                 var item = dataList.Find(p => p.IP == ip);
 53                 if (item == null)
 54                 {
 55                     item = new IPCacheInfo();
 56                     item.IP = ip;
 57                     item.ReqTime.Add(DateTime.Now);
 58                     dataList.Add(item);
 59 
 60                     return true;
 61                 }
 62                 else
 63                 {
 64                     if (item.ReqTime.Count > maxTimes)
 65                     {
 66                         item.ReqTime.RemoveAt(0);
 67                     }
 68 
 69                     var nowTime = DateTime.Now;
 70                     if (isFailAddIn)
 71                     {
 72                         #region 請求被拒絕也需要加入當次請求
 73                         item.ReqTime.Add(nowTime);
 74                         if (item.ReqTime.Count >= maxTimes)
 75                         {
 76                             if (item.ReqTime[0].AddSeconds(partSecond) > nowTime)
 77                             {
 78                                 return false;
 79                             }
 80                             else
 81                             {
 82                                 return true;
 83                             }
 84                         }
 85                         else
 86                         {
 87                             return true;
 88                         }
 89                         #endregion
 90                     }
 91                     else
 92                     {
 93                         #region 請求被拒絕就不需要加入當次請求了
 94                         if (item.ReqTime.Count >= maxTimes)
 95                         {
 96                             if (item.ReqTime[0].AddSeconds(partSecond) > nowTime)
 97                             {
 98                                 return false;
 99                             }
100                             else
101                             {
102                                 item.ReqTime.Add(nowTime);
103                                 return true;
104                             }
105                         }
106                         else
107                         {
108                             item.ReqTime.Add(nowTime);
109                             return true;
110                         }
111                         #endregion
112                     }
113                 }
114             }
115         }
116     }
117 
118     public class IPCacheInfo
119     {
120         public string IP { get; set; }
121 
122         private List<DateTime> reqTime = new List<DateTime>();
123         public List<DateTime> ReqTime
124         {
125             get { return this.reqTime; }
126             set { this.reqTime = value; }
127         }
128     }

所有,請求過的數據都存儲在了記憶體中,對小網站來說,訪問頻率本來就不高,也不需要太多控制。。。

歡迎,拍磚!點贊!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天在做資料庫實驗時,總是手動的向資料庫中添加少量的固定數據,於是就想如何向資料庫中導入大量的動態的數據?在網上瞭解了網路爬蟲,它可以幫助我們完成這項工作,關於網路爬蟲的原理和基礎知識,網上有大量的相關介紹,本人不想在累述,個人覺得下麵的文章寫得非常的好(網路爬蟲基本原理一、網路爬蟲基本原理二)。 ...
  • 1.模板頁 2.數據綁定 1 public void SearchSql(int CurrentPage) 2 { 3 pds.AllowPaging = true; 4 pds.PageSize = 8; 5 pds.CurrentPageIndex = CurrentPage; 6 DataSe ...
  • 一、什麼是.Net平臺? .Net平臺是微軟搭建的技術平臺,技術人員在此平臺上進行應用的搭建與開發。它提供了運行所必須的環境.NET Framework類庫以及CLR(公共語言運行時)。好比我們人類的生存必須基於有氧氣的基礎之下。程式也不例外,它的運行也需要很多所必需的環境。這就是.Net平臺。 二 ...
  • static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); FormStart fs = new FormStart(); fs.ShowDi ...
  • IOC容器就是具有依賴註入功能的容器,IOC容器負責實例化、定位、配置應用程式中的對象及建立這些對象間的依賴。應用程式無需直接在代碼中new相關的對象,應用程式由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表者。 IOC初始化的過程主要就是讀取XML資源,並解析,最 ...
  • 分享一款基於asp.net mvc框架開發的社區產品--近乎。目前可以在官網免費下載,下載地址:http://www.jinhusns.com/Products/Download?type=whp 1 引言 1.1 目的 用於社會化開發平臺的架構設計指導,闡述基礎設施及關鍵技術構件、業務構件的設計思 ...
  • 今天學習,如標題。創建一個類,欄位屬性構造函數:Source code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task ...
  • abstract 用關鍵字abstract修飾的類叫做抽象類,且只能作為基類,也不能實例化。 用abstract定義的抽象類中不一定只包含抽象方法 ,可以包含非抽象方法。 abstract定義的方法一定用放在抽象類中。 派生類中一定要實現抽象類中的所有的抽象方法,否則派生類也要聲明為抽象類。 抽象方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...