防伪标记功能安全吗?

3

我有一个关于Mvc防伪标记的问题

在mvc razor页面中,我们可以在表单中放置代码:@Html.AntiForgeryToken(),它会生成一个令牌,这个令牌会填充到一个隐藏的输入字段中,例如:

 <input name="__RequestVerificationToken" type="hidden"
 value="6I2CsrmAhiDlHewQ4q4khXAENgaa66kDiGwHgaN5DV0f4W2_c2nyVA-q2OCingcgKLPNhSSeyuS_WaTmAGzpo3F5gUq9Wx89iXH1ujq6ZwGG5rO8v_F-4hYj5gEVZ1-E-DpxkcO7zIjMUKVH1bjPMo7Ot3UJHLl5r9isfCLyiOA1">

问题:我可以轻松创建一个请求来下载这个MVC Razor页面,以获取“__RequestVerificationToken”字段中的令牌,然后发送错误数据来攻击指定的服务器。这是否意味着防伪令牌功能也不安全?

回答:这并不意味着防伪令牌功能不安全。攻击者需要知道如何获取有效的令牌并将其用于恶意目的。因此,建议您采取必要的措施来保护您的应用程序,例如使用HTTPS和定期更改密钥。

2个回答

1

AntiForgeryToken() 旨在确保跨站请求伪造攻击(CSRFs)无法成功,并且令牌可以做到这一点:如果表单目标的请求来自另一个站点,则不会有正确的令牌,因此该请求将立即被拒绝。如果其他站点必须首先联系您的站点以获取令牌,那么它可能就像最初通过您的站点一样。


是的,我的意思是其他网站必须先从我的网站下载页面,然后才能获得正确的令牌,使用正确的令牌提交他的错误数据。我进行了测试,从我的网站复制令牌,然后将此令牌放入一个HTML页面中,带有一个提交按钮和一个隐藏值,它可以成功提交。 - Dragon
@Dragon 如Ufuk所述,相应的cookie应该可以防止这种情况发生。 - dlev
@Dragon 请记得,如果您在显示表单之前创建cookie,则使用隐私浏览来显示表单。 - Ufuk Hacıoğulları
@UfukHacıoğulları 抱歉,我有点困惑,我的问题是:1.使用控制台应用程序,创建一个请求以从site1下载page1 2.从page1的结果中获取令牌 3.使用令牌将数据提交到page1的操作。 - Dragon
访问我的页面后,我没有看到创建 Cookie。 - Dragon
显示剩余2条评论

1

安全性高。在表单中放置防伪令牌还会创建一个名为__RequestVerificationToken的cookie,并使用相同的令牌进行验证请求。由于攻击者无法在应用程序域中添加cookie,因此无法通过此验证。

Steve Sanderson有一篇很好的博客文章,详细解释了这一点。


<form name="badform" method="post" action="http://local.test.com//Home/Text"> <input type="hidden" name="Notice" id="Notice" value="错误数据" /> <input name="__RequestVerificationToken" type="hidden" value="6I2CsrmAhiDlHewQ4q4khXAENgaa66kDiGwHgaN5DV0f4W2_c2nyVA-q2OCingcgKLPNhSSeyuS_WaTmAGzpo3F5gUq9Wx89iXH1ujq6ZwGG5rO8v_F-4hYj5gEVZ1-E-DpxkcO7zIjMUKVH1bjPMo7Ot3UJHLl5r9isfCLyiOA1"> <input type="submit" value="提交" /> </form> ---- 您可以看到我已经获取了令牌,并将其放入我的HTML页面中,提交到其他站点,它正在工作。 - Dragon
现在问题并没有完全解决,当我在同一个浏览器中测试来自两个不同域的两个不同页面时,Page1(来自Domain1)可以使用令牌向Page2(来自Domain2)提交数据,但如果我在两个不同的浏览器中打开它们,则无法正常工作,这可能与cookie有关,但我现在无法解决它。 - Dragon
1
看起来他们在同一个浏览器中共享cookie,我可以在Domain2中看到cookie '__RequestVerificationToken',但在Domain1(包含攻击页面)中找不到。 - Dragon
我想与您分享一篇文章,非常不错。http://adam.kahtava.com/journal/2009/11/25/what-are-anti-cross-site-request-forgery-tokens-and-what-are-they-good-for/ - Dragon
@Dragon 这样就解释了。我以为你的控制台应用程序只是在进行解析,并且你是通过浏览器发布数据。你可能需要查看这个问题来限制请求:https://dev59.com/1nVD5IYBdhLWcg3wRpaX。 - Ufuk Hacıoğulları
显示剩余4条评论

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