在ASP.NET MVC中,ValidateAntiForgeryTokenAttribute调用的验证逻辑允许匿名防伪令牌,即没有任何用户特定信息(如IIdentity.Name或ClaimUid)的令牌. 因此,如果未使用声明且登录后未设置HttpContext.User(并非
因此,如果未使用声明且登录后未设置HttpContext.User(并非罕见),则系统的恶意用户可以使用恶意用户自己的合法获取的防伪令牌对任何其他用户发起CSRF攻击.
这似乎并不可取.为什么允许使用匿名令牌?
MVC中的反CSRF系统允许匿名用户,因为它需要保护登录页面,根据定义,您在登录之前是匿名的.特别是,它试图防御的攻击是 Login CSRF.由于反CSRF令牌分为HTTP cookie和隐藏的< input>元素,攻击者是否能够启动登录CSRF取决于他所处的位置.当然 – 您可以说服我的浏览器提交< form>包含您的令牌,但我的浏览器会将我的cookie连同请求一起提交给服务器. cookie和表单令牌不仅仅编码字符串“anonymous”:它们还包含将两者链接在一起的随机标识符.在这种情况下,由于您不知道我的cookie中包含的随机标识符,您仍然无法对我进行登录CSRF攻击.
如果攻击者与目标网站共享域名(例如,attacker.shareddomain.com和bank.shareddomain.com),则攻击者可以为* .shareddomain.com设置cookie并用他自己的一个覆盖受害者的cookie选择.这将允许进行CSRF攻击.您需要其他机制(如2FA或HTML5本地存储)来防止共享子域方案中的CSRF攻击.