你的位置:首页 > ASP.net教程

[ASP.net教程]C# 站点IP访问频率限制 针对单个站点

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               else101               {102                 item.ReqTime.Add(nowTime);103                 return true;104               }105             }106             else107             {108               item.ReqTime.Add(nowTime);109               return true;110             }111             #endregion112           }113         }114       }115     }116   }117 118   public class IPCacheInfo119   {120     public string IP { get; set; }121 122     private List<DateTime> reqTime = new List<DateTime>();123     public List<DateTime> ReqTime124     {125       get { return this.reqTime; }126       set { this.reqTime = value; }127     }128   }

所有,请求过的数据都存储在了内存中,对小网站来说,访问频率本来就不高,也不需要太多控制。。。

欢迎,拍砖!点赞!