背景
上午臨近午飯時些椒,公司同事反饋驗證碼被攻擊灌水掸刊。我們匆忙查詢驗證碼明細,對已頻繁出現(xiàn)的IP插入黑名單忧侧,但IP仍然隔斷時間頻繁變動,不得已之下只能先封禁對應(yīng)公司id的驗證碼發(fā)送功能松逊。年初時候肯夏,專門對SSO站點的發(fā)送驗證碼升級到極驗的驗證,已經(jīng)杜絕了普通的攻擊烁兰,沒想到?jīng)]升級的這個系統(tǒng)又遭受洗禮...
思考辦法
防灌水通用解決辦法一般有幾種:
- Ip+手機號限制
頻繁變化ip和手機號時徊都,此辦法無效
- 發(fā)送驗證碼頁面端提供簡單圖形驗證碼
能解決部分攻擊。
- 采取12306圖片庫或極驗等復(fù)雜手段
能解決大部分攻擊币喧,但超過一定頻率需要收費
學(xué)到的知識點
由于調(diào)用發(fā)送驗證碼的方法非常多,在這個方法內(nèi)只能定位到IP和手機號杀餐,定位不到Web層具體的Action,在此過程中了解到https://www.cnblogs.com/huangtailang/p/4550177.html所提到的System.Diagnostics.StackTrace和System.Diagnostics.StackFrame定位到方法上層調(diào)用堆棧朱巨。然后就順騰摸瓜把漏掉圖形驗證碼的常用頁面先補上,不常用的頁面改掉發(fā)送接口琼讽。處理細節(jié)不再細述洪唐,只記錄下Diagnostics的相關(guān)信息。
/// <summary>
/// 獲取堆棧
/// </summary>
/// <returns></returns>
public static string GetStackTraceModelName()
{
//當前堆棧信息
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
System.Diagnostics.StackFrame[] sfs = st.GetFrames();
//過慮的方法名稱,以下方法將不會出現(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()
這個調(diào)用信息是有Third.Start記錄旗国,可見能追蹤到完整的調(diào)用鏈注整。這只是簡單的演示,如更復(fù)雜的交叉調(diào)用寿冕,異步、并行等的并未在這里實踐蚂斤。
擴展思考
以上方法適用于.netFramework和.netCore,可用于做日志記錄槐沼,調(diào)用鏈等行為岗钩。
asp.netcore里也有Microsoft.AspNetCore.Diagnostics,https://www.cnblogs.com/linezero/p/Diagnostics.html
略作總結(jié)兼吓,本篇結(jié)束,那幫閑的蛋疼亂搞攻擊的人审孽,折騰了我一天浑娜。雖然現(xiàn)在禁了他們發(fā)送驗證碼筋遭,但還是一直在發(fā)請求,頭疼ying....留個念頭以待以后深思编饺。
安全和防護依然是重中之重啊透且!