CSRF保护背后的核心思想是黑客不知道代币价值吗?

信息安全 Web应用程序 csrf
2021-09-05 03:34:21

我试图完全理解 CSRF 背后的概念,更重要的是,如何防范它。

我可以假设,仅使用 CSRF,因此没有 XSS 或其他技术,黑客无法知道我插入页面的随机反 CSRF 令牌的值吗?

1个回答

你的理解是正确的。

背景

考虑 CSRF 攻击的最简单方法是您的浏览器打开了两个选项卡 - Tab A: www.mybank.com和 Tab B: www.attacker.com

(正如@Alex 在评论中指出的那样,多个选项卡不是必需的;重要的是您的浏览器mybank.com在内存中有 auth cookie。如果您mybank.com早一点打开,然后没有注销,CSRF 也同样会发生,浏览到attacker.com

饼干

从历史上看,将您的身份验证/会话令牌存储在 cookie 中是很常见的。这对于纯 HTML 页面(即没有 javascript)很方便,因为当您向 发送请求时www.mybank.com,浏览器将自动附加任何相关的身份验证 cookie ——您的 HTML 页面不需要任何操作来维持会话。CSRF 是对基于 cookie 的身份验证令牌的攻击:如果 Tab B ( www.attacker.com) 向 发送请求www.mybank.com,浏览器会自动附加身份验证 cookie,即 Tab B 可以像登录到 Tab A 一样发送请求。

解决方案

您需要将您的身份验证/会话令牌放在不是 cookie 的地方。记住选项卡 B 看不到选项卡 A 中的任何内容,您可以在许多地方放置身份验证/会话令牌:

  • HTML 页面的某处(可能在隐藏的 HTML 元素中),
  • 或在非 cookie HTTP 响应标头中,
  • 或者如果这是一个 API,那么您可以将它放在token: ___JSON 正文字段中,等等。

只要它不在 cookie 中,在哪里都无所谓。

为了完整起见,我将补充一点,您的反 CSRF 令牌需要足够长且随机,以防止攻击者猜到它。例如,如果您对所有用户使用相同的 anti-CSRF 令牌,或者您从用户名派生出来,那么 Tab B 无法读取 Tab A 的内容也没关系,因为他们可以猜到令牌并将其包含在他们的盲目 CSRF 请求中。


参考