GVKun编程网logo

asp.net – AntiForgeryToken是否需要会话状态?(asp.net token验证)

17

在本文中,我们将为您详细介绍asp.net–AntiForgeryToken是否需要会话状态?的相关知识,并且为您解答关于asp.nettoken验证的疑问,此外,我们还会提供一些关于ASP.NETC

在本文中,我们将为您详细介绍asp.net – AntiForgeryToken是否需要会话状态?的相关知识,并且为您解答关于asp.net token验证的疑问,此外,我们还会提供一些关于ASP.NET Core 中的Ajax全局Antiforgery Token配置、ASP.net MVC AntiForgeryToken over AJAX、ASP.NET MVC中的AntiForgeryToken是否可以防止所有CSRF攻击?、asp.net – MVC 2 AntiForgeryToken – 为什么对称加密IPrinciple?的有用信息。

本文目录一览:

asp.net – AntiForgeryToken是否需要会话状态?(asp.net token验证)

asp.net – AntiForgeryToken是否需要会话状态?(asp.net token验证)

我不使用会话,所以我将它与我不需要的所有HTTP模块一起删除.

我有时会收到此错误:System.Web.Mvc.HttpAntiForgeryException:无法解密防伪令牌.如果此应用程序由Web场或群集托管,请确保所有计算机都运行相同版本的ASP.NET网页,并且< machineKey> configuration指定显式加密和验证密钥. AutoGenerate不能在群集中使用.

或者这一个:System.Web.Mvc.HttpAntiForgeryException:提供的防伪令牌适用于与当前用户不同的基于声明的用户.

当我启用会话时,它可以工作.

所以问题是:csrf的东西是否依赖于会话状态?

解决方法

防伪标记不需要ASP.NET会话.令牌存储在隐藏的表单字段和cookie中,与cookie会话分开(您可以找到详细信息 here).此外,当防伪令牌无效时,会抛出异常,因此看起来您遇到的问题与防伪令牌无关.也许记录一个fiddler会话,将它附加到一个新的SO问题,我们应该能够更好地指导你.

ASP.NET Core 中的Ajax全局Antiforgery Token配置

ASP.NET Core 中的Ajax全局Antiforgery Token配置

前言

本文基于官方文档 《在 ASP.NET Core 防止跨站点请求伪造 (XSRF/CSRF) 攻击》扩展另一种全局配置Antiforgery方法,适用于使用ASP.NET Core Razor + JQuery Ajax的项目,喜欢玩前后端分离的同学可以酌情参考,但希望不要对XSRF/CSRF掉以轻心,更不要不做处理。

Antiforgery Token 介绍

跨站点请求伪造(XSRF/CSRF)攻击跟浏览器中登录验证之后保存的Cookie有关,恶意站点通过向攻击目标站点发起非法请求时,浏览器按规则是会带上Cookie信息的,此时被攻击站点就会认为是用户操作行为,如果被利用在修改密码等操作上,对用户的信息安全就会带来威胁。为抵御 CSRF 攻击最常用的方法是使用同步器标记模式(STP)。 而Antiforgery Token(防伪令牌)是ASP.NET Core中的STP实现方案。

STP的防御过程:

  1. 服务器发送到客户端的当前用户的标识相关联的令牌。
  2. 客户端返回将令牌发送到服务器进行验证。
  3. 如果服务器收到与经过身份验证的用户的标识不匹配的令牌,将拒绝请求。

熟悉ASP.NET和ASP.NET Core的同学应该都不陌生,因为在ASP.NET时期就有防止XSRF攻击的方法,ASP.NET MVC中,IHtmlHelper.BeginForm默认情况下生成防伪令牌,而ASP.NET Core中,使用FormTagHelper默认也会生成防伪令牌的。

解决方案

Form表单提交

TagHelper用法:

<form asp-controller="Manage" asp-action="ChangePassword" method="post">
    ...
</form>

HtmlHelper 生成Form的用法:

@using (Html.BeginForm("ChangePassword", "Manage"))
{
    ...
}

普通html form表单用法:

<form action="/" method="post">
    @Html.AntiForgeryToken()
</form>

那么在Razor渲染之后,表单中就会生成一个隐藏的表单字段:

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkS ... s2-m9Yw">

那么Ajax中要怎么处理呢?

官方文档虽然有提到Ajax的处理方法,但是它指的Ajax是js原生实现XMLHttpRequest,而不是我们一般所认识的JQuery.ajax。所以本文就要介绍一下在使用JQuery.ajax时的全局配置。

场景一、从普通表单获取Antiforgery Token

这种方法跟上面提到的Form表单提交一致,只要把所生成的隐藏的表单字段也一并提交到服务器即可。


$.ajax({
    url:"/Manage/ChangePassword",
    type:"post"
    data: { "__RequestVerificationToken":"CfDJ8NrAkS ... s2-m9Yw" }
})

但是这种方法有个弊端,就是需要配置的东西很多,又要在Contorller中加[ValidateAntiForgeryToken]特性,又要在表单中处理使其生成隐藏字段。

有没有更方便的方法?当然有!而且即使是文档中号称自动防范 XSRF/CSRF的Razor Pages都同样需要!因为它并没有处理Ajax的场景。

场景二、全局配置,自动处理

全局获取Forgery Token

全局(每个页面)获取Forgery Token就是文档中提到的注入Microsoft.AspNetCore.Antiforgery.IAntiforgery并调用GetAndStoreTokens方法,但是由于需要达到全局获取,我需要把这个方法的调用写到布局页,如默认MVC模版的Views/Shared/_Layout.cshtml

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}

<script>
    var csrfToken = ''@GetAntiXsrfRequestToken()'';
</script>

Ajax全局配置

JQuery.ajax里全局设置头部的方法是$.ajaxSetup,按照文档,把所需的头部字段RequestVerificationToken配置上上面获取到的令牌变量csrfToken,即可实现在每个Ajax请求都带有Forgery Token。

(function (window, document, $) {
    $.ajaxSetup({
        headers: {
            ''RequestVerificationToken'': csrfToken
        }
    });
})(window, document, jQuery);

总结

虽然现在流行前后端分离了,包括我在内,也用上高大上的React、Angular、Vue等优秀框架,Github前端也把JQuery去掉了,但是Razor在ASP.NET Core中的份量有增无减,2.0版本带来了更轻量的Razor Pages, 因此Razor+JQuery的热度不会那么快退去,希望这篇文章能给大家在Razor+JQuery技术的使用过程中带来一点参考价值。

原文出处:https://www.cnblogs.com/ElderJames/p/The-Ajax-global-Antiforgery-Token-configuration-in-ASPNET-Core.html

ASP.net MVC AntiForgeryToken over AJAX

ASP.net MVC AntiForgeryToken over AJAX

我目前正在ASP.net中开发一个MVC应用程序.我使用 AJAX.ActionLink在记录列表中提供删除链接,但这是非常不安全的.我把这个:
<AcceptVerbs(HttpVerbs.Post)>

在执行删除的功能上,停止仅通过URL调用的函数.但是,仍然存在的另一个安全漏洞是,如果我要创建一个包含此内容的基本html页面:

<form action="http://foo.com/user/delete/260" method="post">
<input type="submit" />
</form>

它仍将是一个帖子,但来自不同的位置.

是否可以将AntiForgeryToken与AJAX ActionLink一起使用?如果是这样,这是一种安全的方法吗?我还没有意识到更多的安全漏洞吗?

解决方法

我并不特别了解AJAX ActionLink,但可以从WebForms页面使用[AcceptVerbs(HttpVerbs.Post),ValidateAntiForgeryToken]属性发布到MVC操作.

您可以使用反射来获取用于设置cookie的MVC方法以及用于MVC验证的匹配表单输入.

看到这个答案:Using an MVC HtmlHelper from a WebForm

ASP.NET MVC中的AntiForgeryToken是否可以防止所有CSRF攻击?

ASP.NET MVC中的AntiForgeryToken是否可以防止所有CSRF攻击?

使用AntiForgeryToken要求每个请求都传递一个有效的令牌,因此带有简单脚本将数据发布到我的Web应用程序的恶意网页将不会成功。

但是,如果恶意脚本首先发出一个简单的GET请求(由Ajax发出),以便在隐藏的输入字段中下载包含防伪令牌的页面,然后将其提取出来并用于进行有效的POST,该怎么办?

是否有可能,或者我缺少什么?

答案1

小编典典

是的,这就是您需要做的。

只要您在每个受保护的页面上生成一个新令牌,<%= Html.AntiForgeryToken() %>
并始终使用[ValidateAntiForgeryToken]

这实现了OWASP 的CSRF预防备忘单中讨论的同步器令牌模式。

为了使脚本成功发出可接受的请求,它必须首先获取表单并读取令牌,然后发布令牌。相同来源策略将阻止在浏览器中允许此操作。一个站点向另一个站点发出AJAX样式的http请求;只对自己。如果出于某种原因可以违反同一来源政策,那么您将变得脆弱。

请注意,如果您具有跨站点脚本漏洞,则攻击者可以滥用xss漏洞来规避同一原始策略提供的保护(因为该脚本现在从您自己的站点运行,因此SOP成功了)。然后,注入的脚本可以愉快地读取并重新提交令牌。通过XSS克服CSRF保护的这种技术最近在某些蠕虫中很常见。基本上,如果您具有XSS,那么保护CSRF就是浪费时间,因此请确保您都不容易受到这两种攻击。

需要注意的另一件事是Flash和Silverlight。这两种技术都不订阅相同的原始策略,而是使用跨域策略文件来限制对远程资源的访问。如果您在自己的站点上发布跨域策略xml文件,则Flash
/ Silverlight脚本只能访问站点上的资源。如果您确实发布了此文件,则永远只允许将受信任的第三方服务器列入白名单,而永远不允许*。

在OWASP上了解有关CSRF的更多信息,
另请参见:XSS预防备忘单

asp.net – MVC 2 AntiForgeryToken – 为什么对称加密IPrinciple?

asp.net – MVC 2 AntiForgeryToken – 为什么对称加密IPrinciple?

我们最近更新了我们的MVC 2解决方案,这更新了AntiForgeryToken的工作方式.不幸的是,这不再符合我们的 AJAX框架.

问题是MVC 2现在使用对称加密来编码关于用户的一些属性,包括用户的Name属性(来自IPrincipal).我们能够使用AJAX安全地注册新用户,之后后续的AJAX调用将无效,因为当用户被授予新的主体时,防伪令牌将会改变.还有其他可能发生这种情况的情况,例如用户更新姓名等.

我的主要问题是为什么MVC 2甚至打扰使用对称加密?那为什么它关心主体上的用户名属性呢?

如果我的理解是正确的,那么任何随机共享秘密都可以.基本原则是将向用户发送包含一些特定数据的cookie(HttpOnly!).然后,需要此cookie来匹配发回的表单变量以及可能具有副作用的每个请求(通常是POST).由于这只是为了防止跨站点攻击,因此很容易制定一个易于通过测试的响应,但前提是您可以完全访问cookie.由于跨站点攻击者无法访问您的用户cookie,因此您受到保护.

通过使用对称加密,检查cookie内容有什么好处?也就是说,如果我已经发送了HttpOnly cookie,则攻击者无法覆盖它(除非浏览器存在重大安全问题),那么为什么我需要再次检查它?

在考虑之后它似乎是那些“增加的安全层”案例之一 – 但是如果你的第一道防线已经下降(HttpOnly)那么攻击者无论如何都会通过第二层,因为他们有完全访问权限对用户cookie集合,可以直接模仿它们,而不是使用间接的XSS / CSRF攻击.

当然我可能会错过一个重大问题,但我还没有找到它.如果这里有一些明显或微妙的问题,那么我想了解它们.

解决方法

添加它是为了在你有一个子域试图攻击另一个子域的情况下提供更好的保护 – bad.example.com试图攻击good.example.com.添加用户名会使bad.example.com更难以在幕后联系good.example.com并尝试让它代表您生成令牌.

展望未来,cookie可能会被删除,因为它对于系统的正常运行并不是绝对必要的. (例如,如果您正在使用表单身份验证,则该cookie可以用作反XSRF cookie,而不是要求系统生成第二个cookie.)例如,可能仅在匿名用户的情况下发出cookie.

今天关于asp.net – AntiForgeryToken是否需要会话状态?asp.net token验证的分享就到这里,希望大家有所收获,若想了解更多关于ASP.NET Core 中的Ajax全局Antiforgery Token配置、ASP.net MVC AntiForgeryToken over AJAX、ASP.NET MVC中的AntiForgeryToken是否可以防止所有CSRF攻击?、asp.net – MVC 2 AntiForgeryToken – 为什么对称加密IPrinciple?等相关知识,可以在本站进行查询。

本文标签: