یافتن اکشن متدهای به اشتباه کش شده در ASP.NET MVC
نویسنده: وحید نصیری
تاریخ: ۱۳۹۲/۰۶/۱۱ ۲۳:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using System;
using System.Linq;
using System.Reflection;
// Add a ref. to \Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Mvc.dll
using System.Web.Mvc;
// Add a ref. to System.Web
using System.Web.UI;
namespace FindOutputCaches
{
class Program
{
static void Main(string[] args)
{
var path = @"D:\site\bin\Web.dll";
var asmTarget = Assembly.LoadFrom(path);
checkSecuredControllers(asmTarget);
Console.WriteLine("Press a key...");
Console.Read();
}
private static void checkSecuredControllers(Assembly asmTarget)
{
// یافتن کلیه کنترلرهایی که فیلتر اوتورایز دارند
var securedControllers = asmTarget.GetTypes()
.Where(type => typeof(IController).IsAssignableFrom(type) &&
Attribute.IsDefined(type, typeof(AuthorizeAttribute)) &&
!type.Name.StartsWith("T4MVC"))
.ToList();
foreach (var controller in securedControllers)
{
// یافتن کلیه اکشن متدهای کنترلر جاری
var actionMethods = controller.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Where(method => typeof(ActionResult).IsAssignableFrom(method.ReturnType))
.ToList();
foreach (var method in actionMethods)
{
// یافتن متدهایی که دارای آوت پوت کش هستند
var attributes = method.GetCustomAttributes(typeof(OutputCacheAttribute), true);
if (attributes == null || !attributes.Any())
continue;
var outputCache = (OutputCacheAttribute)attributes[0]; // AllowMultiple = false
if (outputCache.Location == OutputCacheLocation.None)
continue; //سبب عدم کش شدن شده است؛ مثلا برای کارهای ایجکسی
Console.WriteLine("Detected incorrect usage of OutputCache in:\n {0}-->{1}",
controller.FullName, method.Name);
}
}
}
}
}