列出控制器方法及其授权属性或缺少这些属性

本文关键字:属性 授权 控制器 方法 | 更新日期: 2023-09-27 18:31:20

我想构建一个安全检查模块,我们将该模块添加到我们的项目中,以便在发现安全问题并且网站处于调试模式时注入覆盖层。

我想尝试的第一个示例是列出未设置授权属性(或授权属性的扩展)的控制器和方法。

有没有一种简单的方法来获取控制器/方法及其授权属性的列表(有些是自定义的),或者缺少它们?

主要目标是确保每个方法都有一个集合,即使它是允许匿名的,从而迫使开发人员认识到他们有公开/不受保护的方法。

如果有其他更好的方法来实现这一目标,我也想听听,但我喜欢有一个页面指示器的想法。例如:"3 种方法缺少授权属性,并且向用户公开"。

列出控制器方法及其授权属性或缺少这些属性

很难

得到一个符合你账单的完整答案,但你可以很容易地编写一个安全控制器来检查你的其余页面/方法(或在应用程序启动时运行)。 下面是一些示例代码,可帮助您入门:

var asm = Assembly.GetExecutingAssembly();
var x=asm.GetTypes()
  .Where(type => typeof(Controller).IsAssignableFrom(type)) //filter controllers
  .Where(controller=>controller.CustomAttributes.Any(ca=>ca.AttributeType.Name=="TranslateFilter"))
  .Where(controller=>controller.Name!="Translation")
  .SelectMany(type => type.GetMethods())
  .Where(method => method.IsPublic && !method.IsDefined(typeof(NonActionAttribute)))
  .Where(method=>method.ReturnType.Name=="ActionResult")
  .Where(method=>method.CustomAttributes.All(ca => ca.AttributeType.Name != "HttpPostAttribute"))
  .Select(t=>new {Action=t.Name,Controller=t.ReflectedType.Name.Replace("Controller", "")});

这是从我编写的自定义翻译引擎中获取的。 这里的许多条件都不适用,但我把它们留给你,让你了解你还能做什么,以及如何去做。 它专门查找具有 TranslateFilter 属性的控制器,并且不是名为 Translation 的控制器,是一种公共方法,返回一种ActionResult类型并且没有属性 HttpPostAttribute