.netcore 堆栈调用方法小记
背景
上午临近午饭时,公司同事反馈验证码被攻击灌水。我们匆忙查询验证码明细,对已频繁出现的IP插入黑名单,但IP仍然隔断时间频繁变动,不得已之下只能先封禁对应公司id的验证码发送功能。年初时候,专门对SSO站点的发送验证码升级到极验的验证,已经杜绝了普通的攻击,没想到没升级的这个系统又遭受洗礼...
思考办法
防灌水通用解决办法一般有几种:
- Ip+手机号限制
频繁变化ip和手机号时,此办法无效
- 发送验证码页面端提供简单图形验证码
能解决部分攻击。
- 采取12306图片库或极验等复杂手段
能解决大部分攻击,但超过一定频率需要收费
学到的知识点
由于调用发送验证码的方法非常多,在这个方法内只能定位到IP和手机号,定位不到Web层具体的Action,在此过程中了解到https://www.cnblogs.com/huangtailang/p/4550177.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('-', '>');
}
下面我们定义一些代码来演示效果:
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.Start
public class HomeController : Controller
{
public IActionResult Start()
{
var msg = new First().Start();
return Content(msg);
}
}
访问结果如下:
Web.Controllers.HomeController.Start()
->Venus.Common.First.Start()
->Venus.Common.Second.Start()
->Venus.Common.Third.Start()
这个调用信息是由Third.Start记录,可见能追踪到完整的调用链。这只是简单的演示,如更复杂的交叉调用,异步、并行等的并未在这里实践。
扩展思考
以上方法适用于.netFramework和.netCore,可用于做日志记录,调用链等行为。
asp.netcore里也有Microsoft.AspNetCore.Diagnostics,https://www.cnblogs.com/linezero/p/Diagnostics.html
略作总结,本篇结束,那帮闲的蛋疼乱搞攻击的人,折腾了我一天。虽然已经禁了他们发送验证码,但还是一直在发请求,头疼ying....留个念头以待以后深思。
安全和防护依然是重中之重啊!
参考链接
C#获取当前堆栈的各调用方法列表
windows管理员利器之用Log Parser Studio分析IIS日志
.netcore 堆栈调用方法小记的更多相关文章
- C#获取当前堆栈的各调用方法列表
在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用 ...
- WPF 判断调用方法堆栈
原文:WPF 判断调用方法堆栈 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee.io 访问博客 ...
- 2018-8-10-WPF-判断调用方法堆栈
title author date CreateTime categories WPF 判断调用方法堆栈 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 17: ...
- webservice的调用方法
一.WebService在cs后台程序中的调用 A.通过命名空间和类名直接调用 示例: WebService ws = new WebService(); string s = ws.HelloWor ...
- Delphi按名字调用方法高级解决方案
转帖于https://lfzhs.iteye.com/blog/980200 按名字调用方法似乎一直以来都是大家比较关注的技术,在论坛上有一个经典的答复: type TProcedure = proc ...
- [No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- ThinkPHP跨控制器调用方法
跨控制器调用方法 1. 先造对象,再调用里面的方法 $sc=new \Home\Controller\IndexController(); 用绝对路径找echo $sc->ShuChu(); ...
- C# 反射之调用方法谈
反射的定义 反射提供了描述程序集.模块和类型的对象(Type 类型). 可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性. 如果代码中使用了特性 ...
- 利用反射调用方法时,处理ref,out参数需要注意的问题(转)
转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...
随机推荐
- 腾讯云 Game-Tech 技术沙龙小游戏专场“空降”长沙
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 小游戏作为今年快速成长的新生态,在开放进入市场之后持续成为行业热点,获得了游戏开发商的高度关注与参与.在 ...
- verilog实现红黄蓝三秒灯
代码如下 test.v文件 led.v文件 module test(); wire led_r,led_g,led_b; ; clk <= ~clk; led c1 ( .clk(clk), . ...
- RMAN命令DELETE操作总结
本篇总结一下RMAN命令中的DELETE操作,DELETE命令用于删除RMAN备份记录以及相应的物理文件. To delete physical backups and copies as well ...
- weblogic---- Remote远程调用
删之前重新写一下以防以后遗忘 一.服务器端 package com.ij34.dao; import javax.ejb.Remote; /** * @author Admin * @date 创建时 ...
- Linux中的文件查找技巧
前言 Linux常用命令中,有些命令可以帮助我们查找二进制文件,帮助手册或源文件的位置,也有的命令可以帮助我们查找磁盘上的任意文件,今天我们就来看看这些命令如何使用. witch witch命令会在P ...
- c#基础知识之 Dataset 索引0没有值
datatable绑定到dataGrieView,在刷新datatable的数据时,常会bug:索引0没有值或索引(int)x没有值 昨天弄了一个下午,发现bug原因: dataGridView中有数 ...
- git pull request 流程
git pull request 用于在 fork 官方 repo 到个人 github, 在本地修改后,向官方 repo 请求合并.在官方团队审查过代码后,就可以将自己所做的改动合并到官方 repo ...
- 【转】curl命令总结,Http Post_Get 常用
curl命令总结 curl 是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE ...
- 010_动态语言与鸭子类型及python2和3的区别
一. 动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, ...
- (2)esp8266多国语言翻译系统
http://bbs.mydigit.cn/simple/?t2649513.html 这个想法不错 原来只是想用esp8266搞一个百度的多国语言翻译系统出来的,只是为了尝试如何调用各种web ap ...