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

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

using System;
using System.Collections.Generic;
using System.IO;
//using System.Linq;
using System.Web;

// <summary>
// IP访问频率控制
// </summary>
public static 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 = 3;

    /// <summary>
    /// 一段时间长度(单位秒),必须大于等于1
    /// </summary>
    private static int partSecond = 30;

    /// <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(0);
                }

                var nowTime = DateTime.Now;
                if (isFailAddIn)
                {
                    #region 请求被拒绝也需要加入当次请求
                    item.ReqTime.Add(nowTime);
                    if (item.ReqTime.Count >= maxTimes)
                    {
                        if (item.ReqTime[0].AddSeconds(partSecond) > nowTime)
                        {
                            return false;
                        }
                        else
                        {
                            return true;
                        }
                    }
                    else
                    {
                        return true;
                    }
                    #endregion
                }
                else
                {
                    #region 请求被拒绝就不需要加入当次请求了
                    if (item.ReqTime.Count >= maxTimes)
                    {
                        if (item.ReqTime[0].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; }
    }
}
时间: 2024-11-06 11:27:53

C# 站点IP访问频率限制 针对单个站点的相关文章

Nginx如何配置除某个IP之外,其他IP,同一IP访问频率限制为30次/每秒

一.限制所有单个ip的访问频率 1.http中的配置 http { #$limit_conn_zone:限制并发连接数 limit_conn_zone $binary_remote_addr zone=one1:10m; #limit_req_zone:请求频率 #$binary_remote_addr:以客户端IP进行限制 #zone=one:10m:创建IP存储区大小为10M,用来存储访问频率 #rate=10r/s:表示客户端的访问评率为每秒10次 limit_req_zone $bina

linux iptables IP限制访问 指定IP访问

又有人攻击服务器了,没有办法又的去防,这里简单介绍一种限制指定IP访问的办法.单个IP的命令是iptables -I INPUT -s 59.151.119.180 -j DROP 封IP段的命令是iptables -I INPUT -s 211.1.0.0/16 -j DROPiptables -I INPUT -s 211.2.0.0/16 -j DROPiptables -I INPUT -s 211.3.0.0/16 -j DROP 封整个段的命令是iptables -I INPUT -

【问底】夏俊:深入站点服务端技术(一)——站点并发的问题

url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-03-16%2F2824221&type=3&count=&appkey=&title=%E6%9C%AC%E6%96%87%E6%9D%A5%E8%87%AA%E6%8B%A5%E6%9C%89%E5%8D%81%E5%B9%B4IT%E4%BB%8E%E4%B8%9A%E7%BB%8F%E9%AA%8C%E3%80%81%E6%93%85%E9%95%BF%E7%BD%91%E

Linux 如何设置只允许域名访问站点而禁止IP访问站点

最近在论坛里看到有人问到 Linux 如何设置只允许域名访问站点而禁止IP访问站点的问题,之前自己也用过这个功能,可以防止别人用 IP 地址来访问到自己的网站,下面我就我自己的环境给出解决方法,我用的是 OneinStack 的一键包,LANMP 环境,其实都差不太多,大同小异,只要理解了原理,下面的就好办了. 具体方法为:找到 apache 的配置文件,我的环境下路径为:/usr/local/apache/conf/httpd.conf,在文件最下面,Include conf/vhost/*.

apache环境下web站点禁止用服务器ip访问

在我们的web站点做好后其实可以通过ip来直接访问的,当然这样在我们在做测试的时候是方便,但是一旦在实际的生产服务器中这样允许ip直接访问源站点是一个危险的举动,如果你的生产服务器被人恶意绑定,流量劫持到别的域名,会被广告联盟给封杀.因为你的域名本来就可以通过ip来访问的,如果被人恶意用域名解析到你的ip上,你的网站就能通过别人的域名来访问,时间一长广告联盟发现域名和ip不符合就封杀了,还有这样别人把你的ip绑定到其它恶意域名上一样也是很危险的.所以我们可以用apache的Rewrite和PHP

轻型的接口访问频率限制服务模型的设计与实现【转】

原文地址:http://www.iam3y.com/html/878.html 最近需要设计open api的接口频次控制相关实现,便查阅相关文档. 接口频次控制主要包括两方面: (1)业务ID对某一个接口某时间间隔(如一分钟)内访问的次数 限制 (2)业务ID在某个时间周期(如一天)内访问的次数 限制 对于存储并进行频次计数的服务来说,要具备以下的特点: (1)自更新能力,在某个约定的时间点对所有的node(节点)进行自更新操作,也就是常说的出厂设置 (2)协议轻型能力,协议必须尽可能简单,才

ASP.NET网站限制访问频率

最近做了一个免费发短信的小网站(http://freesms.cloudapp.net/),但发现最近有人破解了我的验证码,以每3秒/条的速度用我的短信服务来发他的广告.更换验证码程序和过滤关键字只是治标不治本的方法,为了彻底阻止此类事件的发生,我们还是来看一下怎样通过优化程序来实现. 其实同样的程序除了防止别人滥发请求以外,还对预防拒绝服务(DoS)攻击同样适用哦.不妨来看看. 基本目标:限制同一IP访问网站的频率.比如,我们限制为每240分钟来自同一IP的用户最多只能够访问首页40次.其他页

Django Restful Framework【第三篇】认证、权限、限制访问频率

一.认证 认证请求头 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import

nginx配置访问频率

nginx可以通过limit_conn_zone和limit_req_zone两个组件来限制客户端访问服务端的目录和文件的频率和次数,能够抵挡住部分cc.ddos攻击. 限制访问频率: http{ ... #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存, #以$binary_remote_addr 为key,限制平均每秒的请求为20个, #1M能存储16000个状态,rete的值必须为整数, #如果限制两秒钟一个请求,可以设置成30r/m lim