狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

.net簡單的限流過濾器

freeflydom
2024年6月13日 8:42 本文熱度 1012

API接口都是提供給第三方服務/客戶端調用,所有請求地址以及請求參數都是暴露給用戶的。

每次請求一個HTTP請求,用戶都可以通過F12,或者抓包工具看到請求的URL鏈接,然后copy出來。這樣是非常不安全的,有人可能會惡意的刷我們的接口,那這時該怎么辦呢?

增加一個全局過濾器 獲取客戶端的IP  限制固定時間內的訪問次數即可

第一步:創建全局過濾器 RateLimitFilter

public class RateLimitFilter : ActionFilterAttribute

    {

        private const int MaxRequests = 30; //1分鐘訪問最大頻率

        private bool StartUp = true; //是否啟用

        public override void OnActionExecuting(ActionExecutingContext context)

        {

            if (StartUp)

            {

                base.OnActionExecuting(context);

                string clientId = GetIP();

                if (GetCache(clientId) == null)

                {

                    SetCacheRelativeTime(clientId, 1, 60);

                }

                else

                {

                    var cs = int.Parse(GetCache(clientId).ToString());

                    SetCacheRelativeTime(clientId, cs += 1, 60);

                }

                //var x = int.Parse(GetCache(clientId).ToString());

                if (int.Parse(GetCache(clientId).ToString()) > MaxRequests)

                {

                    //返回值規范不統一

                    context.Result = new ContentResult { Content = "<script type='text/javascript'>alert('" + clientId + "  訪問過于頻繁,請稍等片刻!');</script><h1 style='text-align: center; color: red;'>" + clientId + "  訪問過于頻繁,請稍等片刻!<h1>" };


                    //返回值規范統一   前端有錯誤提示

                    //context.Result = new JsonResult()

                    //{

                    //    Data = new { Result = false, status = false, suc = false, message = "" + clientId + "  訪問過于頻繁,請稍等片刻!" },

                    //    JsonRequestBehavior = JsonRequestBehavior.AllowGet

                    //};

                }

            } 

        }



        /// <summary>

        /// 獲取客戶端IP地址

        /// </summary>

        /// <returns>若失敗則返回回送地址</returns>

        public static string GetIP()

        {

            //如果客戶端使用了代理服務器,則利用HTTP_X_FORWARDED_FOR找到客戶端IP地址

            string userHostAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (!string.IsNullOrEmpty(userHostAddress))

            {

                userHostAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString().Split(',')[0].Trim();

            }

            //否則直接讀取REMOTE_ADDR獲取客戶端IP地址

            if (string.IsNullOrEmpty(userHostAddress))

            {

                userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

            }

            //前兩者均失敗,則利用Request.UserHostAddress屬性獲取IP地址,但此時無法確定該IP是客戶端IP還是代理IP

            if (string.IsNullOrEmpty(userHostAddress))

            {

                userHostAddress = HttpContext.Current.Request.UserHostAddress;

            }

            //最后判斷獲取是否成功,并檢查IP地址的格式(檢查其格式非常重要)

            if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))

            {

                return userHostAddress;

            }

            return "127.0.0.1";

        }


        /// <summary>

        /// 檢查IP地址格式

        /// </summary>

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

        /// <returns></returns>

        public static bool IsIP(string ip)

        {

            return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");

        }


        #region  設置相對過期時間Cache值(即:訪問激活后不過期)

        /// <summary>        

        /// 設置相對過期時間Cache值(即:訪問激活后不過期)

        /// </summary>        

        /// <param name="objectkey"></param>        

        /// <param name="objObject"></param>        

        /// <param name="timeSpan">超過多少時間不調用就失效,單位是秒</param>        


        public static void SetCacheRelativeTime(string objectkey, object objObject, int timeSpan)

        {

            System.Web.Caching.Cache objCache = HttpRuntime.Cache;

            objCache.Insert(objectkey, objObject, null, DateTime.MaxValue, TimeSpan.FromSeconds(timeSpan));

        }

        #endregion


        #region  獲取當前應用程序指定CacheKey的Cache值

        /// <summary>

        /// 獲取當前應用程序指定CacheKey的Cache值

        /// </summary>

        /// <param name="CacheKey"></param>

        /// <returns></returns>y

        public static object GetCache(string CacheKey)

        {

            try

            {

                System.Web.Caching.Cache objCache = HttpRuntime.Cache;

                Object value = objCache[CacheKey];

                if (value != null)

                {

                    return value;

                }

                else

                {

                    return null;

                }

            }

            catch (Exception)

            {

                return null;

            }


        }

        #endregion

    }

第二步:FilterConfig類并注冊你的全局過濾器

public class FilterConfig

 {

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)

        {

            filters.Add(new RateLimitFilter()); // 過濾器

        }

 }

第三步:Global.asax 文件中注冊全局過濾器

protected void Application_Start()

{

            AreaRegistration.RegisterAllAreas();

            RouteConfig.RegisterRoutes(RouteTable.Routes);

            BundleConfig.RegisterBundles(BundleTable.Bundles);

            UnityConfig.RegisterComponents();


            // 注冊全局過濾器

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);


}

原文鏈接https://www.cnblogs.com/zj19940610/p/18244414 作者:風中起舞 


該文章在 2024/6/13 8:42:45 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved