我有一个使用AntiForgeryTokens且始终使用HTTPS的MVC4网站。据我了解,只要用户会话相同,就可以重复使用防伪令牌。
我担心某种攻击,有人以某种方式取得令牌并重新使用它来提交没有用户知识的表单。
此设置是否存在真正的攻击风险?我是否需要考虑某种防止令牌重用的方法?
答案 0 :(得分:1)
每个会话应该只有一个CSRF令牌。如果会话超时,则此时CSRF令牌将过期。
由于攻击者无法读取CSRF令牌(至少不存在攻击者读取CSRF令牌作为会话ID cookie的风险),除非您不需要生成新的令牌有一个新的会议与它一起去。
我看到的唯一例外是,如果使用有效的用户会话cookie尝试表单提交,但使用了不正确的CSRF令牌(即用户正在被他们正在使用的另一个站点攻击)。在这种情况下,您可能希望生成新的CSRF令牌并向自己标记警报,以便可以调查请求。您可能希望在第一个不正确的CSRF令牌之后生成警报(因为根本不会发生包含不正确的CSRF令牌的请求),但您可以在 n 失败后尝试刷新令牌以减少一个令牌是暴力强迫,同时允许用户使用你的系统而不被拒绝服务(尽管在这种情况下拒绝服务是一个小问题,因为攻击将来自他们自己的机器)。
以这种方式思考 - 反伪造令牌的唯一目的是阻止CSRF。如果攻击者可以以任何方式获取此攻击,那么他们已经可以访问 - 已经完成了攻击。例如,如果您的网站上存在XSS漏洞,这足以让某人恶意攻击您的用户 - 他们也不需要进行CSRF攻击。
答案 1 :(得分:0)
这里有一些关于防伪的doco:http://msdn.microsoft.com/en-us/library/dd492767(v=vs.118).aspx
基本上,AF令牌是一个隐藏字段,您可以将其置于任何表单上,如下所示:
@Html.AntiForgeryToken()
然后通过如下装饰动作/方法在控制器中验证它:
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
每次在视图中调用AntiForgeryToken时,它都会生成一个新令牌,然后在控制器中进行验证。
它在整体安全性方面只占很小的一部分。除此之外,您通常会在客户端使用cookie来识别会话和身份验证:
.ASPXAUTH
ASP.Net_SessionId
__RequestverificationToken
除此之外,你还有SSL,它还增加了另一层安全和保护。
AF令牌可以通过JMeter等自动化工具轻松获取,并用于将帖子发送回服务器,但普通用户可以使用。对此一无所知。任何试图使用此令牌的人都需要使用相同的cookie,这更难以模拟。