专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C# 站点IP访问频率限制 针对单个站点

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 1:08:07       共计:3642 浏览

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

这样的简单限制,我们又不想对数据进行存库(显得过于浪费资



    /// <summary>

        /// IP访问频率控制器

        /// </summary>

        public class IPCacheManager

        {

            /// <summary>

            /// IP缓存集合

            /// </summary>

            private static List<IPCacheInfo> dataList = new List<IPCacheInfo>();

            private static object lockObj = new object();

   

            /// <summary>

            /// 一段时间内,最大请求次数,必须大于等于1

            /// </summary>

            private static int maxTimes = ;

   

            /// <summary>

            /// 一段时间长度(单位秒),必须大于等于1

            /// </summary>

            private static int partSecond = ;

   

            /// <summary>

            /// 请求被拒绝是否加入请求次数

            /// </summary>

            private static bool isFailAddIn = false;

   

            static IPCacheManager()

            {

            }

   

            /// <summary>

            /// 设置时间,默认maxTimes=3, partSecond=30

            /// </summary>

            /// <param name="_maxTimes">最大请求次数</param>

            /// <param name="_partSecond">请求单位时间</param>

            public static void SetTime(int _maxTimes, int _partSecond)

            {

                maxTimes = _maxTimes;

                partSecond = _partSecond;

            }

   

            /// <summary>

            /// 检测一段时间内,IP的请求次数是否可以继续请求

            /// 和使用

            /// </summary>

            /// <param name="ip"></param>

            /// <returns></returns>

            public static bool CheckIsAble(string ip)

            {

                lock (lockObj)

                {

                    var item = dataList.Find(p => p.IP == ip);

                    if (item == null)

                    {

                        item = new IPCacheInfo();

                        item.IP = ip;

                        item.ReqTime.Add(DateTime.Now);

                        dataList.Add(item);

   

                        return true;

                    }

                    else

                    {

                        if (item.ReqTime.Count > maxTimes)

                        {

                            item.ReqTime.RemoveAt();

                        }

   

                        var nowTime = DateTime.Now;

                        if (isFailAddIn)

                        {

                            #region 请求被拒绝也需要加入当次请求

                            item.ReqTime.Add(nowTime);

                            if (item.ReqTime.Count >= maxTimes)

                            {

                                if (item.ReqTime[].AddSeconds(partSecond) > nowTime)

                                {

                                    return false;

                                }

                                else

                                {

                                    return true;

                                }

                            }

                            else

                            {

                                return true;

                            }

                            #endregion

                        }

                        else

                        {

                            #region 请求被拒绝就不需要加入当次请求了

                            if (item.ReqTime.Count >= maxTimes)

                            {

                                if (item.ReqTime[].AddSeconds(partSecond) > nowTime)

                                {

                                    return false;

                                }

                                else

                                {

                                    item.ReqTime.Add(nowTime);

                                    return true;

                                }

                            }

                            else

                            {

                                item.ReqTime.Add(nowTime);

                                return true;

                            }

                            #endregion

                        }

                    }

                }

            }

        }

   

        public class IPCacheInfo

        {

            public string IP { get; set; }

   

            private List<DateTime> reqTime = new List<DateTime>();

            public List<DateTime> ReqTime

            {

                get { return this.reqTime; }

                set { this.reqTime = value; }

            }

        }



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


版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:.NET Core Redis 帮助类五大类型实现 | ·下一条:Asp.Net Core安全防护-客户端IP白名单限制

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有