其他一些形式,例如登录和注册现在也使用AntiForgeryToken,但是由于一些原因,我一开始对他们的需求表示怀疑。
登录表单要求发布者知道正确的凭据。我真的想不出CSRF攻击会从中受益的任何方式,特别是如果我检查请求是否来自同一主机(检查Referer标头)。
AntiForgeryToken令牌每次都会生成不同的值页面加载的时间。如果我在登录页面上打开了两个选项卡,然后尝试发布它们,则第一个将成功加载。第二个将失败,并出现AntiForgeryTokenException(首先加载两个页面,然后尝试发布它们)。使用更安全的页面-这显然是必不可少的,而对于登录页面-似乎已经过头了,并且只是自找麻烦。的形式。我以为在每种帖子形式中使用令牌都是过大的判断是正确的吗?如果是的话,哪种形式将从中受益,而哪种形式绝对不会受益?
P.S.在StackOverflow上也会问这个问题,但我并不完全相信。我以为会在这里提出要求,以获取更多的安全范围
#1 楼
是的,在登录页面中包含防伪令牌很重要。为什么?由于可能发生“登录CSRF”攻击。在登录CSRF攻击中,攻击者使用攻击者的帐户将受害者登录到目标站点。例如,考虑一下邪恶的攻击者Evelyn对Paypal用户Alice的攻击。如果Paypal不能保护其登录页面免受CSRF攻击(例如使用防伪令牌),则攻击者可以静默地将Alice的浏览器登录到Paypal的Evelyn帐户中。爱丽丝被带到Paypal网站,爱丽丝已登录,但以Evelyn身份登录。假设Alice然后单击页面以将其信用卡链接到她的Paypal帐户,并输入她的信用卡号。爱丽丝(Alice)认为她正在将信用卡链接到她的Paypal帐户,但实际上她已经将其链接到伊夫琳(Evelyn)的帐户。现在,伊夫林(Evelyn)可以购买东西,并从爱丽丝的信用卡中扣除。哎呀。这是微妙的并且有点晦涩难懂,但足够严重,您应该为用于登录的表单操作目标添加防伪令牌。有关此漏洞的更多详细信息和一些实际示例,请参阅本文。 br />什么时候可以放弃防伪令牌?通常,如果目标是URL,并且访问该URL没有副作用,则无需在该URL中包含防伪令牌。
粗略的经验法则是:在所有POST请求中都包含一个防伪令牌,但对于GET请求则不需要它。但是,这种粗略的经验法则是非常粗略的近似。它假设GET请求都是无副作用的。在设计良好的Web应用程序中,希望如此,但实际上,有时Web应用程序设计人员不会遵循该准则并实现具有副作用的GET处理程序(这是一个坏主意,但这并不罕见) 。这就是为什么我建议基于准则的要求,而不是基于GET vs POST的准则,该准则是否会对Web应用程序的状态产生副作用。
评论
我明白了。我想这确实是有道理的。我唯一担心的是让用户烦恼,如果他们同时打开两个表单,然后尝试发布它们,其中一个很可能会通过验证:(
– Artiom Chilaru
2011-2-12在11:08
用户从两个选项卡登录时收到的错误没有任何解决方法吗?
–埃姆雷·肯奇(Emre Kenci)
14年6月18日在13:41
@AntonAnsgar,使用CSRF令牌并不意味着当用户从两个选项卡登录时必须出现错误。如果出现此类错误,请使用更好的CSRF令牌实现。
– D.W.
14年6月18日在13:44
谢谢。用户在两个选项卡上打开登录页面。从其中一个登录,转到另一个,然后再次尝试登录,该应用程序将引发异常。 “ System.Web.Mvc.HttpAntiForgeryException:提供的防伪令牌是为用户”“提供的,但当前用户为loginin @ user”这是在asp.net mvc 4中。我正在使用[ValidateAntiForgeryToken]
–埃姆雷·肯奇(Emre Kenci)
2014年6月18日13:48
我是否正确地认为,如本博文stackoverflow.com/questions/14970102/…所述,设置-AntiForgeryConfig.SuppressIdentityHeuristicChecks = true将有效地使您退回对伊夫林风格的攻击?
–克里斯·内维尔(Chris Nevill)
17 Mar 1 '17 at 12:37
#2 楼
当您需要防止某人使用特定凭据恶意将您登录到网站时,可能需要在登录页面上具有令牌。我可以看到这种情况,如果有人陷害某些需要使用特定用户登录的内容。话虽这么说,但这是一个人为的例子。评论
不是那么人为...请参阅@ D.W。的答案。
–AVID♦
2011-2-13在9:33
评论
这个问题有更新吗?关于提交多个并发登录页面的问题?我当前的解决方案是从登录页面中删除防伪令牌。我认为这不再是问题。.我们的登录页面上已经有防伪令牌,这不再是问题。
我还确保了我的web.config中指定了machineKey,这排除了我最初遇到的许多问题