ASP.NET MVC CSRF防伪令牌是否会过期?

18

我正在实现CSRF防伪保护在我的ASP.NET MVC 5应用程序中。特别是,我参考Mike Wasson在ASP.NET网站上描述的方法来保护响应AJAX请求的控制器方法,例如WebAPI控制器。此方法利用AntiForgery.GetTokens方法生成基于用户的加密防伪标记,然后使用AntiForgery.Validate验证提交的标记属于当前用户。

我的问题是:这些标记是否有生存时间?它们会过期吗?如果是这样,它们的有效期是多长?文档对此没有说明。

我不想在我的系统中允许永久有效的标记。此外,我希望向客户端传达他们需要请求新标记之前的时间。如果必要,我可以使用FormsAuthentication.Encrypt来实现过期标记;然而,如果AntiForgery类的方法中已经内置了过期功能,那么我想避免不必要的复杂性。


2
我也想知道。试着看源代码:https://github.com/ASP-NET-MVC/aspnetwebstack/blob/4e40cdef9c8a8226685f95ef03b746bc8322aa92/src/System.Web.WebPages/Helpers/AntiForgery.cs - nmit026
2个回答

3
每个易受攻击的HTTP POST都会生成两个令牌并直接发送到服务器。因此,如果你在表单上点击“提交”按钮,将生成两个令牌:一个基于用户凭据的cookie和一个基于相同凭据的表单值,可以在这里详细了解:http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages
这个cookie令牌实际上可以过期,除了尝试匿名身份验证的情况外,对系统而言是多余且不必要的。例如见这里(第一个答案):MVC 2 AntiForgeryToken - Why symmetric encryption + IPrinciple?
与此同时,另一个令牌对攻击者来说是不可读的,并且每次请求时都会生成这些令牌。因此,不需要担心过期日期。 编辑:实际上,你提到的文章(Mike Wasson)的评论部分中也有这些信息 ;)

9
谢谢您的回复。我理解这两个令牌是如何工作的,并了解HTML表单和AJAX请求之间微妙但不同的处理方法。然而,我的问题具体是这些令牌是否会过期,在Mike Wasson的帖子中没有讨论或评论中提到。谢谢! - kbrimington
3
@kbrimington在页面底部的IAntiForgeryAdditionalDataProvider部分中提到的上面的第一篇文章,似乎暗示它没有过期时间。它说你可以实现额外的检查,然后说明“验证例程可以实现超时(通过将当前时间与创建令牌时存储的时间进行比较)、随机数检查例程或任何其他所需逻辑。”你是否得到了有关令牌过期的明确答复? - David Yates
2
@DavidYates,感谢您提醒我。当时,我得出结论认为它们不会过期,并构建了自己的到期逻辑。我不记得在2.5年前我提问时这个部分是否存在于文章中。IAntiForgeryAdditionalDataProvider的意图似乎是允许轻松定制令牌及其验证逻辑,包括实现超时功能。 - kbrimington

1
您可以查看通过浏览器创建的cookie。它们是没有过期时间的会话cookie。这意味着当您关闭浏览器时,cookie将被删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接