.net 中的堆棧調(diào)用方法小記

背景

上午臨近午飯時(shí),公司同事反饋驗(yàn)證碼被攻擊灌水。我們匆忙查詢驗(yàn)證碼明細(xì),對(duì)已頻繁出現(xiàn)的IP插入黑名單,但I(xiàn)P仍然隔斷時(shí)間頻繁變動(dòng),不得已之下只能先封禁對(duì)應(yīng)公司id的驗(yàn)證碼發(fā)送功能。年初時(shí)候,專門對(duì)SSO站點(diǎn)的發(fā)送驗(yàn)證碼升級(jí)到極驗(yàn)的驗(yàn)證,已經(jīng)杜絕了普通的攻擊,沒想到?jīng)]升級(jí)的這個(gè)系統(tǒng)又遭受洗禮...

思考辦法

防灌水通用解決辦法一般有幾種:

  • Ip+手機(jī)號(hào)限制

頻繁變化ip和手機(jī)號(hào)時(shí),此辦法無效

  • 發(fā)送驗(yàn)證碼頁(yè)面端提供簡(jiǎn)單圖形驗(yàn)證碼

能解決部分攻擊。

  • 采取12306圖片庫(kù)或極驗(yàn)等復(fù)雜手段

能解決大部分攻擊,但超過一定頻率需要收費(fèi)

學(xué)到的知識(shí)點(diǎn)

由于調(diào)用發(fā)送驗(yàn)證碼的方法非常多,在這個(gè)方法內(nèi)只能定位到IP和手機(jī)號(hào),定位不到Web層具體的Action,在此過程中了解到https://www.cnblogs.com/huangtailang/p/4550177.html所提到的System.Diagnostics.StackTraceSystem.Diagnostics.StackFrame定位到方法上層調(diào)用堆棧。然后就順騰摸瓜把漏掉圖形驗(yàn)證碼的常用頁(yè)面先補(bǔ)上,不常用的頁(yè)面改掉發(fā)送接口。處理細(xì)節(jié)不再細(xì)述,只記錄下Diagnostics的相關(guān)信息。

 /// <summary>
        /// 獲取堆棧
        /// </summary>
        /// <returns></returns>
        public static string GetStackTraceModelName()
        {
            //當(dāng)前堆棧信息
            System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
            System.Diagnostics.StackFrame[] sfs = st.GetFrames();
            //過慮的方法名稱,以下方法將不會(huì)出現(xiàn)在返回的方法調(diào)用列表中
            string _fullName = string.Empty, _methodName = string.Empty;
            for (int i = 1; i < sfs.Length; ++i)
            {
                //非用戶代碼,系統(tǒng)方法及后面的都是系統(tǒng)調(diào)用,不獲取用戶代碼調(diào)用結(jié)束
                if (System.Diagnostics.StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break;
                var methedInfo = sfs[i].GetMethod();
                _methodName = methedInfo.ReflectedType.FullName + "." + methedInfo.Name;//方法名稱
                                                                                        //sfs[i].GetFileLineNumber();//沒有PDB文件的情況下將始終返回0
                                                                                        // if (_filterdName.Contains(_methodName)) continue;
                _fullName = _methodName + "()\r\n->" + _fullName;
            }
            st = null;
            sfs = null;
            return _fullName.TrimEnd('-', '>');
        }

下面我們定義一些代碼來演示效果:


 public class First
    {
        public string Start()
        {
           return new Second().Start();
        }
    }

 public class Second
    {
        public string Start()
        {
          return  new Third().Start();
        }
    }

 public class Third
    {
        public string Start()
        {
            var msg = Utils.GetStackTraceModelName();
            return msg;
        }
    }

然后在Web層調(diào)用First.Start

 public class HomeController : Controller
    {
        public IActionResult Start()
        {
            var msg = new First().Start();
            return Content(msg);
        }
    }

訪問結(jié)果如下:

Web.Controllers.HomeController.Start()
->Venus.Common.First.Start()
->Venus.Common.Second.Start()
->Venus.Common.Third.Start()

這個(gè)調(diào)用信息是有Third.Start記錄,可見能追蹤到完整的調(diào)用鏈。這只是簡(jiǎn)單的演示,如更復(fù)雜的交叉調(diào)用,異步、并行等的并未在這里實(shí)踐。

擴(kuò)展思考

以上方法適用于.netFramework和.netCore,可用于做日志記錄,調(diào)用鏈等行為。
asp.netcore里也有Microsoft.AspNetCore.Diagnostics,https://www.cnblogs.com/linezero/p/Diagnostics.html

略作總結(jié),本篇結(jié)束,那幫閑的蛋疼亂搞攻擊的人,折騰了我一天。雖然現(xiàn)在禁了他們發(fā)送驗(yàn)證碼,但還是一直在發(fā)請(qǐng)求,頭疼ying....留個(gè)念頭以待以后深思。

安全和防護(hù)依然是重中之重啊!

參考鏈接

https://www.cnblogs.com/huangtailang/p/4550177.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容