欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

.net簡單的限流過濾器

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

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

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

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

第一步:創(chuàng)建全局過濾器 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)

                {

                    //返回值規(guī)范不統(tǒng)一

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


                    //返回值規(guī)范統(tǒng)一   前端有錯誤提示

                    //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()

        {

            //如果客戶端使用了代理服務(wù)器,則利用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  設(shè)置相對過期時間Cache值(即:訪問激活后不過期)

        /// <summary>        

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

        /// </summary>        

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

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

        /// <param name="timeSpan">超過多少時間不調(diào)用就失效,單位是秒</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  獲取當(dāng)前應(yīng)用程序指定CacheKey的Cache值

        /// <summary>

        /// 獲取當(dāng)前應(yīng)用程序指定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 作者:風(fēng)中起舞 


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