【发布时间】:2020-12-13 12:10:58
【问题描述】:
我正在寻找一种方法来防止不安全的直接对象引用 (IDOR) 攻击,使用 AOP,因此我不需要向每个 API 控制器方法添加代码来检查它。
IDOR 攻击的一个示例是拦截请求并更改请求的正文,以便对象的 CompanyId 和其他属性不同,以尝试将记录插入到不同的公司(除了用户所属的公司——在 JWT 中指定)。
问题是每个方法都接受自己的参数作为不同的类。例如:
public async Task<ActionResult> CreateAdjustment(Adjustment adjustment)
和
public async Task<ActionResult> CreateHistory(History history)
所以通用代码需要知道如何检查adjustment 对象和history 对象。每个参数都有一个CompanyId 属性。第二种方法可以将history 上的CompanyId 属性与JWT 中的CompanyId 进行比较(如果它们不同则抛出异常)。
我只是不想将相同的代码添加到每个 API 控制器方法中,如下所示:
var companyClaim = HttpContext.User.Claims
.FirstOrDefault(x => x.Type == Consts.Claims.CompanyId);
if (companyClaim == default) { return Unauthorized(); }
if (Convert.ToInt32(companyClaim.Value) != history.CompanyId)
{ return Unauthorized(); }
也许每个 DTO/域参数都实现了 ICompanyWhatever 之类的东西来表示它将具有 CompanyId 属性?那么AOP代码可以用同样的方式检查每个参数吗?
我遇到的问题是属性无法访问方法的参数。还是他们?有没有办法从属性中得到它?如果没有,也许使用拦截?
【问题讨论】:
-
我现在正在研究 IActionFilter。它在模型绑定之后执行,但在执行操作方法之前。这可能是我需要的。
标签: c# .net-core attributes aop