列出控制器方法及其授权属性或缺少这些属性
本文关键字:属性 授权 控制器 方法 | 更新日期: 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
。