예제 #1
0
        public static void Update(RateLimitEntity item, ref bool ifContain)
        {
            RateLimitEntity rateLimitOld = RateLimitAccess.GetRateLimitByID(item.TableID);

            if (item.ZoneId == rateLimitOld.ZoneId)
            {
                var list = RateLimitAccess.GetRateLimits(item.ZoneId, null, null, string.Empty);
                list.RemoveAt(list.FindIndex((r) => { return(r.TableID == item.TableID); }));

                if (IfContain(list, item))
                {
                    ifContain = true;
                    return;
                }
                else
                {
                    ifContain = false;
                }

                RateLimitAccess.Edit(item);
            }
            else
            {
                RateLimitBusiness.Add(item, ref ifContain);
                if (!ifContain)
                {
                    Delete(rateLimitOld.TableID, rateLimitOld.OrderNo, rateLimitOld.ZoneId);
                }
            }
        }
예제 #2
0
        public static void Add(RateLimitEntity item)
        {
            string cons = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();

            using (SqlConnection conn = new SqlConnection(cons))
            {
                string     query = @"INSERT INTO dbo.t_RateLimiting_Rules
        ( ZoneId ,
          OrderNo ,
          Url ,
          Threshold ,
          Period ,
          Action ,
          EnlargementFactor ,
          LatestTriggerTime ,
          RateLimitTriggerIpCount ,
          RateLimitTriggerTime ,
          Remark ,
          CreatedBy ,
          CreatedTime,
          IfBanIp,
          IfOpenRateLimitRule,
          IfTesting
        )
VALUES  ( @zoneID , -- ZoneId - nvarchar(512)
          @order , -- OrderNo - int
          @url , -- Url - nvarchar(512)
          @threshold , -- Threshold - int
          @period , -- Period - int
          N'challenge' , -- Action - nvarchar(256)
          @enlargement , -- EnlargementFactor - int
          GETUTCDATE() , -- LatestTriggerTime - datetime
          @triggerIpCount , -- RateLimitTriggerIpCount - int
          @triggerTime , -- RateLimitTriggerTime - int
          N'' , -- Remark - nvarchar(1024)
          @user , -- CreatedBy - 
          GETUTCDATE(),  -- CreatedTime - datetime
          @ifBanIp , -- IfBanIp - 
          @ifOpenRateLimitRule , -- IfOpenRateLimitRule - 
          @ifTesting  -- IfTesting - 
        )";
                SqlCommand cmd   = new SqlCommand(query, conn);
                cmd.Parameters.AddWithValue("@zoneID", item.ZoneId);
                cmd.Parameters.AddWithValue("@order", item.OrderNo);
                cmd.Parameters.AddWithValue("@threshold", item.Threshold);
                cmd.Parameters.AddWithValue("@period", item.Period);
                cmd.Parameters.AddWithValue("@url", item.Url);
                cmd.Parameters.AddWithValue("@enlargement", item.EnlargementFactor);
                cmd.Parameters.AddWithValue("@triggerIpCount", item.RateLimitTriggerIpCount);
                cmd.Parameters.AddWithValue("@triggerTime", item.RateLimitTriggerTime);
                cmd.Parameters.AddWithValue("@user", item.CreatedBy);
                cmd.Parameters.AddWithValue("@ifBanIp", item.IfBanIp);
                cmd.Parameters.AddWithValue("@ifOpenRateLimitRule", item.IfOpenRateLimitRule);
                cmd.Parameters.AddWithValue("@ifTesting", item.IfTesting);
                conn.Open();

                cmd.ExecuteNonQuery();
            }
        }
예제 #3
0
        private bool IfMatchConditionAccumulation(RateLimitEntity rateLimit, LogAnalyzeModel analyzeModel)
        {
            bool bResult = false;

            bResult = rateLimit.Url.EndsWith("*") ? ((analyzeModel.RequestUrl.ToLower().StartsWith(rateLimit.Url.Replace("*", "").ToLower())) && (analyzeModel.RequestCount >= rateLimit.EnlargementFactor * rateLimit.Threshold * accumulationSecond / (float)rateLimit.Period))
                : ((analyzeModel.RequestUrl.ToLower().Equals(rateLimit.Url.ToLower())) && (analyzeModel.RequestCount >= rateLimit.EnlargementFactor * rateLimit.Threshold * accumulationSecond / (float)rateLimit.Period));
            return(bResult);
        }
예제 #4
0
        public static void UpdateOrder(int action, int id, int order, string zoneId)
        {
            int             toOrder = action == 1 ? order - 1 : order + 1;
            RateLimitEntity toItem  = RateLimitAccess.GetRateLimitByOrderNo(toOrder, zoneId);

            if (toItem.TableID > 0)
            {
                RateLimitAccess.EditOrder(id, toOrder, toItem.TableID, order);
            }
        }
예제 #5
0
        private static bool IfContain(List <RateLimitEntity> rateLimitEntities, RateLimitEntity rateLimit)
        {
            List <string> vs = new List <string> {
                "ID", "TableID", "OrderNo", "CreatedBy", "ZoneId", "Action", "LatestTriggerTime", "EnlargementFactor", "RateLimitTriggerIpCount", "RateLimitTriggerTime"
            };

            foreach (RateLimitEntity item in rateLimitEntities)
            {
                if (!Utils.DifferenceComparison <RateLimitEntity, RateLimitEntity>(item, rateLimit, vs))
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #6
0
        public static RateLimitEntity GetRateLimitByOrderNo(int order, string zoneId)
        {
            string          cons = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();
            RateLimitEntity item = new RateLimitEntity();

            using (SqlConnection conn = new SqlConnection(cons))
            {
                string     query = @"SELECT Period, 
                                        Threshold, 
                                        Url, 
                                        OrderNo, 
                                        EnlargementFactor, 
                                        RateLimitTriggerIpCount, 
                                        Id, 
                                        ZoneId, 
                                        IfBanIp,
                                        IfOpenRateLimitRule,
                                        IfTesting,
                                        RateLimitTriggerTime FROM t_RateLimiting_Rules where OrderNo=@order and ZoneId=@zoneId";
                SqlCommand cmd   = new SqlCommand(query, conn);
                cmd.Parameters.AddWithValue("@order", order);
                cmd.Parameters.AddWithValue("@zoneId", zoneId);
                conn.Open();

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        item.Period                  = Convert.ToInt32(reader["Period"]);
                        item.Threshold               = Convert.ToInt32(reader["Threshold"]);
                        item.Url                     = Convert.ToString(reader["Url"]);
                        item.OrderNo                 = Convert.ToInt32(reader["OrderNo"]);
                        item.EnlargementFactor       = float.Parse(reader["EnlargementFactor"] == DBNull.Value ? "0" : reader["EnlargementFactor"].ToString());
                        item.RateLimitTriggerIpCount = Convert.ToInt32(reader["RateLimitTriggerIpCount"]);
                        item.TableID                 = Convert.ToInt32(reader["Id"]);
                        item.ZoneId                  = Convert.ToString(reader["ZoneId"]);
                        item.RateLimitTriggerTime    = Convert.ToInt32(reader["RateLimitTriggerTime"]);
                        item.IfBanIp                 = Convert.ToInt32(reader["IfBanIp"]) > 0;
                        item.IfOpenRateLimitRule     = Convert.ToInt32(reader["IfOpenRateLimitRule"]) > 0;
                        item.IfTesting               = Convert.ToInt32(reader["IfTesting"]) > 0;
                    }
                }
            }

            return(item);
        }
예제 #7
0
        public static void Add(RateLimitEntity item, ref bool ifContain)
        {
            var list     = RateLimitAccess.GetRateLimits(item.ZoneId, null, null, string.Empty);
            var orderMax = 0;

            if (null != list.LastOrDefault())
            {
                orderMax = list.LastOrDefault().OrderNo;
            }
            if (IfContain(list, item))
            {
                ifContain = true;
                return;
            }
            else
            {
                ifContain = false;
            }
            item.OrderNo = orderMax + 1;
            RateLimitAccess.Add(item);
        }
예제 #8
0
        public static void TriggerRateLimit(RateLimitEntity rateLimit)
        {
            var cons = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();

            using (var conn = new SqlConnection(cons))
            {
                const string query = @"UPDATE dbo.t_RateLimiting_Rules
                                 SET LatestTriggerTime = GETUTCDATE()  
                                 WHERE Url = @Url 
                                   AND Threshold = @Threshold
                                   AND Period = @Period
                                   AND ZoneId = @ZoneId";
                var          cmd   = new SqlCommand(query, conn);
                cmd.Parameters.AddWithValue("@Threshold", rateLimit.Threshold);
                cmd.Parameters.AddWithValue("@Period", rateLimit.Period);
                cmd.Parameters.AddWithValue("@Url", rateLimit.Url);
                cmd.Parameters.AddWithValue("@ZoneId", rateLimit.ZoneId);
                conn.Open();

                cmd.ExecuteNonQuery();
            }
        }
예제 #9
0
        public static void Edit(RateLimitEntity item)
        {
            var cons = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();

            using (var conn = new SqlConnection(cons))
            {
                const string query = @"UPDATE  dbo.t_RateLimiting_Rules
                                    SET     ZoneId = @zoneID ,
                                            Url = @url ,
                                            Threshold = @threshold ,
                                            Period = @period ,
                                            EnlargementFactor = @enlargement ,
                                            RateLimitTriggerIpCount = @triggerIpCount ,
                                            RateLimitTriggerTime = @triggerTime ,
                                            CreatedBy = @user,
                                            IfBanIp = @ifBanIp,
                                            IfOpenRateLimitRule = @ifOpenRateLimitRule,
                                            IfTesting = @ifTesting
                                    WHERE   Id = @id;";
                var          cmd   = new SqlCommand(query, conn);
                cmd.Parameters.AddWithValue("@zoneID", item.ZoneId);
                cmd.Parameters.AddWithValue("@threshold", item.Threshold);
                cmd.Parameters.AddWithValue("@period", item.Period);
                cmd.Parameters.AddWithValue("@url", item.Url);
                cmd.Parameters.AddWithValue("@enlargement", item.EnlargementFactor);
                cmd.Parameters.AddWithValue("@triggerIpCount", item.RateLimitTriggerIpCount);
                cmd.Parameters.AddWithValue("@triggerTime", item.RateLimitTriggerTime);
                cmd.Parameters.AddWithValue("@user", item.CreatedBy);
                cmd.Parameters.AddWithValue("@id", item.TableID);
                cmd.Parameters.AddWithValue("@ifBanIp", item.IfBanIp);
                cmd.Parameters.AddWithValue("@ifOpenRateLimitRule", item.IfOpenRateLimitRule);
                cmd.Parameters.AddWithValue("@ifTesting", item.IfTesting);
                conn.Open();

                cmd.ExecuteNonQuery();
            }
        }
예제 #10
0
 public static void TriggerRateLimit(RateLimitEntity rateLimit)
 {
     RateLimitAccess.TriggerRateLimit(rateLimit);
 }