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                             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     }

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

欢迎,拍砖!点赞!

posted @ 2016-04-27 13:17  Supper_litt  阅读(1315)  评论(0编辑  收藏  举报