gpt4 book ai didi

c# - 如何在 ASP.NET MVC 4 中默认防止 CSRF?

转载 作者:IT王子 更新时间:2023-10-29 04:30:04 28 4
gpt4 key购买 nike

有没有办法确保 ASP.NET MVC 4 表单在默认情况下免受 CSRF 攻击?

例如,有没有办法让 AntiForgeryToken 自动应用于 View 和 Controller 操作中的所有表单?

这个问题的背景:Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken() helperAnatomy of a Cross-site Request Forgery Attack .

最佳答案

为了补充 osoviejo 的出色回答,下面的说明来 self 最近的 blog post on CSRF ,将他的工作与 Phil 博客中的信息放在一个综合的答案中。

ASP.NET/MVC 为此提供了一种机制:您可以添加到全局 FilterProviders 对象上的过滤器集合。这使您可以针对某些 Controller 而不是其他 Controller ,从而添加所需的安全功能。

首先,我们需要实现一个 IFilterProvider。在下方,您可以找到 Phil Haack 的 Conditional Filter Provider类(class)。首先将此类添加到您的项目中。

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 Controller 方法都需要 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 example web site 上试用- 一旦受到保护,CSRF 攻击将抛出 System.Web.Mvc.HttpAntiForgeryException 而无需添加 [ValidateAntiForgeryToken] 注释。这排除了一大堆与“健忘的程序员”相关的漏洞。

关于c# - 如何在 ASP.NET MVC 4 中默认防止 CSRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9965342/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com