何时不需要/需要使用 AntiForgeryToken?
Posted
技术标签:
【中文标题】何时不需要/需要使用 AntiForgeryToken?【英文标题】:When the use of a AntiForgeryToken is not required /needed? 【发布时间】:2011-06-13 01:47:27 【问题描述】:UPD: 在security.stackexchange.com 上提出了同样的问题,但我得到的答案不同。请关注那里,以获得正确答案!
我正在运营一个相当大的网站,每天有数千次访问,并且拥有相当大的用户群。
自从我开始迁移到 MVC 3 以来,我一直将 AntiForgeryToken 置于多种形式中,用于修改受保护的数据等。
其他一些形式,比如登录/注册现在也使用 AntiForgeryToken,但我开始怀疑他们的需求,原因有几个......
-
登录表单要求发布者知道正确的凭据。我真的想不出 csrf 攻击会从中受益的任何方式。特别是如果我检查请求是否来自同一主机(检查引荐标头)
每次加载页面时,AntiForgeryToken 令牌都会生成不同的值。如果我在登录页面打开了两个选项卡,然后尝试发布它们,第一个将成功加载。第二个将失败并出现 AntiForgeryTokenException(首先加载两个页面,然后尝试发布它们)。使用更安全的页面 - 这显然是必要的邪恶,使用登录页面 - 似乎有点矫枉过正,只是自找麻烦:S
可能还有其他原因导致人们在他们的表单中使用/不使用令牌。我是否正确假设在每个帖子表单中使用令牌是不好的/矫枉过正的,如果是这样 - 什么样的表单会受益从中受益,哪些肯定不会受益?
【问题讨论】:
这里的安全专家已经回答了这个问题:security.stackexchange.com/questions/2120/… @Richard 您是否注意到您在评论中添加的链接与问题顶部的链接相同?并且这个问题是由同一个用户提出的? 【参考方案1】:防伪令牌在用户尚未通过身份验证的网站的公共部分(例如登录和注册表单)中是无用的。 CSRF 攻击的工作方式如下:
-
恶意用户在他的站点上设置了一个类似于您的站点的 html 表单。此表单也可以包含隐藏字段。
他欺骗您的一位网站用户访问他的恶意网址。
用户认为他在您的网站上,填写表单并将其提交到您的网站。
如果用户已在您的网站上通过身份验证,则表单提交成功,并且毫无戒心的用户已删除其帐户(或任何您可以想象的)。
因此,您可以在网站的经过身份验证的部分使用防伪令牌,其中包含可以以某种方式修改用户状态的操作。
备注:检查 Referer 标头以识别来自您网站的请求是不安全的。任何人都可以伪造请求并欺骗此标头。
【讨论】:
我同意你关于伪造引荐标头的观点,但仍然......如果 POST 请求中的引荐标头不同 - 这意味着肯定有问题,对吗? :) 我并不是说它总是会保护我.. 只是另一个可能有用的安全边界 @Binder,想想黑客向您发送一封电子邮件,假装这封电子邮件来自您的银行(称为网络钓鱼),告诉您单击电子邮件中的链接以更新您的帐户例如细节。由于用户在真实站点上经过身份验证,因此他可以代表该用户在实际站点上执行任何操作。防伪令牌旨在防止这种攻击。 如果攻击者伪造登录页面并通过这种方式获取凭据,那么使用令牌保护真实登录页面的意义何在?攻击者无论如何都可以使用他获得的用户名和密码登录。 这个答案是非常错误的。令牌是必要的。在此处查看一个简单的示例攻击:security.stackexchange.com/questions/2120/…以上是关于何时不需要/需要使用 AntiForgeryToken?的主要内容,如果未能解决你的问题,请参考以下文章
何时使用/不使用,@OneToOne 和 @ManyToOne