Чтобы добавить к отличному ответу osoviejo, приведенные ниже инструкции из моего недавнего сообщения в блоге о CSRF объединяют его работу с информацией в блоге Фила в одном исчерпывающем ответе.
ASP.NET / MVC предоставляет механизм для этого: вы можете добавить в коллекцию фильтров глобальный объект FilterProviders
.Это позволяет вам ориентироваться на некоторые контроллеры, а не на другие, добавляя необходимую функцию безопасности.
Во-первых, нам нужно реализовать IFilterProvider.Ниже вы найдете класс поставщика условных фильтров Фила Хаака .Начните с добавления этого класса в ваш проект.
public class ConditionalFilterProvider : IFilterProvider
{
private readonly
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions;
public ConditionalFilterProvider(
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions)
{
_conditions = conditions;
}
public IEnumerable<Filter> GetFilters(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor)
{
return from condition in _conditions
select condition(controllerContext, actionDescriptor) into filter
where filter != null
select new Filter(filter, FilterScope.Global, null);
}
}
Затем добавьте в Application_Start код, добавляющий новый ConditionalFilterProvider
в глобальную коллекцию FilterProviders, который гарантирует, что для всех методов контроллера POST потребуется AntiForgeryToken.
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions =
new Func<ControllerContext, ActionDescriptor, object>[] {
// Ensure all POST actions are automatically
// decorated with the ValidateAntiForgeryTokenAttribute.
( c, a ) => string.Equals( c.HttpContext.Request.HttpMethod, "POST",
StringComparison.OrdinalIgnoreCase ) ?
new ValidateAntiForgeryTokenAttribute() : null
};
var provider = new ConditionalFilterProvider(conditions);
// This line adds the filter we created above
FilterProviders.Providers.Add(provider);
Если вы реализуете два фрагмента кода выше, ваше MVC-приложение должно требовать AntiForgeryToken для каждого POST для сайта.Вы можете попробовать его на примере сайта CSRF Фила Хаака - после защиты атака CSRF выдаст System.Web.Mvc.HttpAntiForgeryException
без добавления аннотации [ValidateAntiForgeryToken]
.Это исключает целый ряд уязвимостей, связанных с «забывчивым программистом».