我想构建一个安全检查模块,当我发现安全问题并且网站处于调试模式时,我们会将这些模块添加到我们的项目中以注入覆盖。
我想尝试的第一个例子是列出没有授权属性(或授权属性的扩展)集的控制器和方法。
是否有一种简单的方法可以获取控制器/方法的列表及其授权属性(有些是自定义属性),或者缺少它们?
主要目标是确保每个Method都有一个集合,即使它是Allow Anonymous,从而迫使开发人员识别他们有暴露/不受保护的方法。
如果还有其他更好的方法来实现这一点,我也希望听到它们,但我喜欢有一个页面指示器的想法。 EX:" 3方法缺少授权属性并暴露给用户"。
答案 0 :(得分:1)
很难为您提供适合您帐单的完整答案,但您可以轻松编写一个安全控制器来检查其余页面/方法(或在应用程序启动时运行)。以下是一些示例代码,可帮助您入门:
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
并且没有属性{ {1}}。