博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 站点IP访问频率限制 针对单个站点
阅读量:5152 次
发布时间:2019-06-13

本文共 4375 字,大约阅读时间需要 14 分钟。

0x00 前言

  写网站的时候,或多或少会遇到,登录,注册等操作,有时候,为了防止别人批量进行操作,不得不做出一些限制IP的操作(当前也可以用于限制某个账号的密码校验等)。

这样的简单限制,我们又不想对数据进行存库(显得过于浪费资源了)。所以就诞生了0x01中提到的,简单IP限制类。

0x01 正文

  理论说多了,终究是理论,分享一下代码

1 ///   2     /// IP访问频率控制器  3     ///   4     public class IPCacheManager  5     {  6         ///   7         /// IP缓存集合  8         ///   9         private static List
dataList = new List
(); 10 private static object lockObj = new object(); 11 12 ///
13 /// 一段时间内,最大请求次数,必须大于等于1 14 /// 15 private static int maxTimes = 3; 16 17 ///
18 /// 一段时间长度(单位秒),必须大于等于1 19 /// 20 private static int partSecond = 30; 21 22 ///
23 /// 请求被拒绝是否加入请求次数 24 /// 25 private static bool isFailAddIn = false; 26 27 static IPCacheManager() 28 { 29 } 30 31 ///
32 /// 设置时间,默认maxTimes=3, partSecond=30 33 /// 34 ///
最大请求次数 35 ///
请求单位时间 36 public static void SetTime(int _maxTimes, int _partSecond) 37 { 38 maxTimes = _maxTimes; 39 partSecond = _partSecond; 40 } 41 42 ///
43 /// 检测一段时间内,IP的请求次数是否可以继续请求 44 /// 和使用 45 /// 46 ///
47 ///
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
reqTime = new List
();123 public List
ReqTime124 {125 get { return this.reqTime; }126 set { this.reqTime = value; }127 }128 }

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

欢迎,拍砖!点赞!

转载于:https://www.cnblogs.com/Supperlitt/p/5438524.html

你可能感兴趣的文章
Ubuntu下关闭防火墙
查看>>
TCP/IP 邮件的原理
查看>>
w3m常用快捷键
查看>>
【Unity 3D】学习笔记四十一:关节
查看>>
原型设计工具
查看>>
windows下的C++ socket服务器(4)
查看>>
css3 2d转换3d转换以及动画的知识点汇总
查看>>
【Java】使用Eclipse进行远程调试,Linux下开启远程调试
查看>>
js对象属性方法
查看>>
对Vue为什么不支持IE8的解释之一
查看>>
Maven安装配置
查看>>
ORA-10635: Invalid segment or tablespace type
查看>>
计算机改名导致数据库链接的诡异问题
查看>>
Windows 8 操作系统 购买过程
查看>>
软件工程课程-个人编程作业
查看>>
Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)
查看>>
ObjectiveC基础教程(第2版)
查看>>
centos 引导盘
查看>>
Notes of Daily Scrum Meeting(12.8)
查看>>
Apriori算法
查看>>