Ответ 1
Чтобы добавить к osoviejo отличный ответ, приведенные ниже инструкции, из моего недавнего сообщения в блоге о CSRF, поместили его работу вместе с информацией в Phil блог в один исчерпывающий ответ.
ASP.NET/MVC предоставляет механизм для этого: вы можете добавить в коллекцию фильтров на глобальном объекте FilterProviders
. Это позволяет настроить таргетинг на некоторые контроллеры, а не на другие, добавив необходимую функцию безопасности.
Во-первых, нам нужно реализовать IFilterProvider. Ниже вы можете найти класс Phil Haack Поставщик условного фильтра. Начните с добавления этого класса в свой проект.
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 на сайт. Вы можете попробовать его на сайте Phil Haack веб-сайт примера CSRF - после защиты CSRF-атака будет бросать System.Web.Mvc.HttpAntiForgeryException
без добавления [ValidateAntiForgeryToken]
аннотация. Это исключает всю уязвимость, связанную с "забывчивым программистом".