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

        1. <span id="taoqw"><dfn id="taoqw"><p id="taoqw"></p></dfn></span>

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

            .net簡單的限流過濾器

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

            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