上午临近午餐时,公司同事反馈验证码被攻击灌水。咱们匆忙查询验证码明细,对已频繁出现的IP插入黑名单,但IP仍然隔断时间频繁变更,不得已之下只能先封禁对应公司id的验证码发送功能。年初时候,专门对SSO站点的发送验证码升级到极验的验证,已经杜绝了普通的攻击,没想到没升级的这个系统又遭受洗礼...css
防灌水通用解决办法通常有几种:html
频繁变化ip和手机号时,此办法无效windows
能解决部分攻击。安全
能解决大部分攻击,但超过必定频率须要收费asp.net
因为调用发送验证码的方法很是多,在这个方法内只能定位到IP和手机号,定位不到Web层具体的Action,在此过程当中了解到http://www.javashuo.com/article/p-qpilmfuu-bo.html所提到的System.Diagnostics.StackTrace和System.Diagnostics.StackFrame定位到方法上层调用堆栈。而后就顺腾摸瓜把漏掉图形验证码的经常使用页面先补上,不经常使用的页面改掉发送接口。处理细节再也不细述,只记录下Diagnostics的相关信息。异步
/// <summary> /// 获取堆栈 /// </summary> /// <returns></returns> public static string GetStackTraceModelName() { //当前堆栈信息 System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); System.Diagnostics.StackFrame[] sfs = st.GetFrames(); //过虑的方法名称,如下方法将不会出如今返回的方法调用列表中 string _fullName = string.Empty, _methodName = string.Empty; for (int i = 1; i < sfs.Length; ++i) { //非用户代码,系统方法及后面的都是系统调用,不获取用户代码调用结束 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('-', '>'); }
下面咱们定义一些代码来演示效果:post
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层调用First.Startui
public class HomeController : Controller { public IActionResult Start() { var msg = new First().Start(); return Content(msg); } }
访问结果以下:url
Web.Controllers.HomeController.Start() ->Venus.Common.First.Start() ->Venus.Common.Second.Start() ->Venus.Common.Third.Start()
这个调用信息是由Third.Start记录,可见能追踪到完整的调用链。这只是简单的演示,如更复杂的交叉调用,异步、并行等的并未在这里实践。spa
以上方法适用于.netFramework和.netCore,可用于作日志记录,调用链等行为。
asp.netcore里也有Microsoft.AspNetCore.Diagnostics,https://www.cnblogs.com/linezero/p/Diagnostics.html
略做总结,本篇结束,那帮闲的蛋疼乱搞攻击的人,折腾了我一天。虽然已经禁了他们发送验证码,但仍是一直在发请求,头疼ying....留个念头以待之后深思。
安全和防御依然是重中之重啊!