zoukankan      html  css  js  c++  java
  • 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     }

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

    欢迎,拍砖!点赞!

  • 相关阅读:
    两个layout之间怎么切换好
    测试- 就从这儿起步
    Fiddler 学习
    我的周记4——“要繁荣富强,不要再让人欺负了”
    谈谈游戏
    我的周记3——“雨打梨花深闭门,忘了青春,误了青春”
    我的周记2——“天道酬勤"
    说说Charles
    Book list
    STL学习笔记(仿函数)
  • 原文地址:https://www.cnblogs.com/Supperlitt/p/5438524.html
Copyright © 2011-2022 走看看