c# asp.net ip黑名单

短信验证码接口被恶意请求,写了一个简单的黑名单规则.
使用静态数组的形式实现,优点为不占用数据库资源且速度更快效率更高. 缺点为数据无持久化,网站重启后黑名单就清空了.
效果为: 如果指定时间内请求次数大于最大请求数并且发送的手机号码大于等于指定号码数量,则加入黑名单,时长为 {BlockTime}
根据如下属性进行配置后,
IsInBlackList方法为判断IP是否在黑名单内,返回bool
RecordRequest方法记录IP和手机号(可以根据功能自己修改具体功能),如满足列入黑名单条件,则自动列入黑名单, 返回bool. 如满足拉黑规则,则返回true,否则返回false

    public class IpBlock
    {

        /// <summary>
        /// 统计时间单位(秒)
        /// </summary>
        private const int Seconds = 60*50;//50分钟

        /// <summary>
        /// 单位时间内请求超出指定次数,则加入黑名单
        /// </summary>
        private const int RequestCount = 3;

        /// <summary>
        /// 单位时间内请求的手机号码数
        /// </summary>
        private const int RequestPhoneCount = 3;
        /// <summary>
        /// 黑名单时间 分钟
        /// </summary>
        private const int BlockTime = 60*24*7; //7天

        /// <summary>
        /// IP黑名单
        /// </summary>
        private static List<BlockedIp> BlackList;

        /// <summary>
        /// 请求详情
        /// </summary>
        private static List<IpRequestModel> RequestList;

        static IpBlock()
        {
            BlackList = new List<BlockedIp>();
            RequestList = new List<IpRequestModel>();
        }


        /// <summary>
        /// IP地址是否在黑名单中
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public static bool IsInBlackList(string ip)
        {
            UpdateBlackList();
            return BlackList.FirstOrDefault(x => x.Ip.Equals(ip)) != null;
        }

        /// <summary>
        /// 记录请求信息并将符合的IP列入黑名单
        /// </summary>
        /// <param name="ip"></param>
        public static bool RecordRequest(string ip, string phone)
        {
            UpdateRequestList();
            RequestList.Add(new IpRequestModel
            {
                Ip = ip,
                RequestTime = DateTime.Now,
                Phone = phone
            });
            var requestRecord = RequestList.Where(x => x.Ip.Equals(ip));
            var count = requestRecord.Count();
            var phoneCount = requestRecord.Select(x => x.Phone).Distinct().Count();
            if (count >= RequestCount && phoneCount >= RequestPhoneCount)
            {
                AddToBlackList(ip);
                return true;
            }
            return false;
        }





        /// <summary>
        /// 更新黑名单
        /// </summary>
        private static void UpdateBlackList()
        {
            var expireList = BlackList.Where(x => x.ExpireTime < DateTime.Now).ToList();
            foreach (var item in expireList)
            {
                BlackList.Remove(item);
            }
        }

        /// <summary>
        /// 将IP列入黑名单
        /// </summary>
        /// <param name="ip"></param>
        private static void AddToBlackList(string ip)
        {
            var item = BlackList.FirstOrDefault(x => x.Ip.Equals(ip));
            if (item != null)
            {
                item.ExpireTime = DateTime.Now.AddMinutes(BlockTime);
            }
            else
            {
                BlackList.Add(new BlockedIp
                {
                    ExpireTime = DateTime.Now.AddMinutes(BlockTime),
                    Ip = ip
                });
            }
        }


        /// <summary>
        /// 更新请求信息
        /// </summary>
        private static void UpdateRequestList()
        {
            var expireList = RequestList.Where(x => x.RequestTime < DateTime.Now.AddSeconds(0-Seconds)).ToList();
            foreach (var item in expireList)
            {
                RequestList.Remove(item);
            }

        }

    }

    public class BlockedIp
    {
        /// <summary>
        /// IP地址
        /// </summary>
        public string Ip { get; set; }

        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime ExpireTime { get; set; }
    }

    public class IpRequestModel
    {
        /// <summary>
        /// IP地址
        /// </summary>
        public string Ip { get; set; }

        /// <summary>
        /// 请求时间
        /// </summary>
        public DateTime RequestTime { get; set; }

        /// <summary>
        /// 手机号
        /// </summary>
        public string Phone { get; set; }

    }

效果:

......
2018-08-31 10:47:51.007 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 10:47:51 IP地址:223.68.67.198 手机号码:177****8475
2018-08-31 10:50:55.412 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:50:55 IP地址:220.190.28.133
2018-08-31 10:50:58.302 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:50:58 IP地址:60.181.172.196
2018-08-31 10:51:00.474 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:00 IP地址:39.171.235.161
2018-08-31 10:51:14.037 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:14 IP地址:60.181.164.123
2018-08-31 10:51:15.677 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:15 IP地址:182.200.0.14
2018-08-31 10:51:21.037 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:21 IP地址:112.12.136.83
2018-08-31 10:51:23.724 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:23 IP地址:42.234.41.134
2018-08-31 10:51:25.802 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:25 IP地址:60.180.34.139
2018-08-31 10:51:28.443 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:28 IP地址:182.200.179.203
2018-08-31 10:51:31.130 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:31 IP地址:115.223.150.237
2018-08-31 10:51:39.990 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:39 IP地址:113.87.130.72
2018-08-31 10:51:46.771 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:46 IP地址:113.247.23.88
2018-08-31 10:51:47.990 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:47 IP地址:60.180.50.65
2018-08-31 10:51:52.459 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:52 IP地址:182.200.7.6
2018-08-31 10:51:57.506 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:57 IP地址:115.223.135.93
2018-08-31 10:52:07.008 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:07 IP地址:223.68.67.198
2018-08-31 10:52:08.758 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:08 IP地址:60.180.235.58
2018-08-31 10:52:28.555 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:28 IP地址:27.18.202.136
2018-08-31 10:52:59.367 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:59 IP地址:113.139.240.243
2018-08-31 10:55:06.790 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 10:55:06 IP地址:125.47.67.224 手机号码:130****1322
2018-08-31 10:55:34.775 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:55:34 IP地址:59.109.117.88
2018-08-31 10:57:40.229 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:57:40 IP地址:180.120.160.12
2018-08-31 11:02:21.105 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:02:21 IP地址:113.139.242.216
2018-08-31 11:14:03.632 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 11:14:03 IP地址:1.194.21.226 手机号码:130****2793
2018-08-31 11:27:52.295 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:27:52 IP地址:27.17.148.80
2018-08-31 11:31:31.718 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 11:31:31 IP地址:125.47.55.70 手机号码:130****1323
2018-08-31 11:31:40.968 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:31:40 IP地址:182.200.3.11
2018-08-31 11:31:45.843 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:31:45 IP地址:125.47.55.70
......

发表评论

电子邮件地址不会被公开。 必填项已用*标注