.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 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...
随机推荐
- verilog实现红黄蓝三秒灯
代码如下 test.v文件 led.v文件 module test(); wire led_r,led_g,led_b; ; clk <= ~clk; led c1 ( .clk(clk), . ...
- javascript的函数、事件
本文内容: 函数 函数的定义方式 函数的调用方式 函数的参数 匿名函数 函数中的this 事件 常见事件 绑定事件 首发日期:2018-05-11 函数: 函数的定义方式: 函数可以有参数,参数为局部 ...
- matlab练习程序(求向量间的旋转矩阵与四元数)
问题是这样,如果我们知道两个向量v1和v2,计算从v1转到v2的旋转矩阵和四元数,由于旋转矩阵和四元数可以互转,所以我们先计算四元数. 我们可以认为v1绕着向量u旋转θ角度到v2,u垂直于v1-v2 ...
- 2步安装1个hive docker运行环境[centos7]
1 构建基础容器 基于centos环境docker环境快速搭建,执行步骤 docker build -t cenosbase7 . 执行此步骤就可以构建1个基础的centos基础运行环境 相关的文件如 ...
- [转] Scala 中的异步事件处理
在任何并发性应用程序中,异步事件处理都至关重要.无论事件的来源是什么(不同的计算任务.I/O 操作或与外部系统的交互),您的代码都必须跟踪事件,协调为响应它们而执行的操作.应用程序可以采用两种基本方法 ...
- LeetCode题解之Binary Tree Right Side View
1.题目描述 2.问题分析 使用层序遍历 3.代码 vector<int> v; vector<int> rightSideView(TreeNode* root) { if ...
- Sqlserver还原master
net stop mssqlserver net start mssqlserver /m"SQLCMD" sqlcmd -s xx sqlcmd -s xx -U sa -P x ...
- Sql Server XML
实验数据: Create table xmldata (name NVARCHAR(20), age int, sex NVARCHAR(5) ) INSERT INTO xmldata VALUES ...
- MySQL常用命令(二)
1.索引分类 1.普通索引 2.唯一索引 3.主键索引 4.外键索引2.普通索引(index) 1.使用规则 1.一个表中可以有多个index字段 2.字段的值可以有重复,也可以为NULL值 3.经常 ...
- spyder 快捷键
本文主要介绍了spyder的快捷键. 常用快捷键 快捷键 中文名称 Ctrl+R 替换文本 Ctrl+1 单行注释,单次注释,双次取消注释 Ctrl+4 块注释,单次注释,双次取消注释 F5 运行 ...