2

我知道

这个问题已经被问过很多次了,但是经过几个小时的搜索,我仍然没有明确的答案。

甚至像https://github.com/pillarjs/understanding-csrf这样的项目也被放弃了,多年来没有像这样回答新的问题和疑虑。

问题

假设我有:

  • 一个后端back.domain.com
  • 上的前端front.domain.com

我的后端是一个简单的 nodejs 应用程序,具有以下其余端点:

  1. POST /login

    1. 接受 JSON 正文,如:{"username": "myname", "password": "mypass"}
    2. 验证凭据
    3. 如果OK给出 200 并创建一个带有会话的 cookie
    4. 如果给出 401
  2. GET /players

    1. 检查 cookie 中的会话
    2. 如果OK给出 200 {"players": "[...]"}
    3. 如果给出 401
  3. POST /player/1

    1. 检查 cookie 中的会话
    2. 如果OK给出 200 并编辑播放器
    3. 如果给出 401

我的前端应用程序有:

  1. /login带有表单(带有usernamepassword字段)的页面,用于发出POST请求back.domain.com/login

  2. /players哪个请求GET请求back.domain.com/players

  3. 发出POST请求的按钮back.domain.com/player/1

问题

  1. 在这种情况下我需要 CSRF 保护吗?

    我认为是的,我需要,因为攻击者可以发出请求并使用我back.domain.com/player/1malicious.site.com会话 cookie 来编辑播放器,因为我在我的domain.com.

  2. X-CSRF-Token我第一次登录时是否需要 CSRF 保护(例如标题) back.domain.com/login

    1. 在这种情况下,我的浏览器中仍然没有任何会话 cookie。
    2. 而且我也不知道在哪里可以获得我的 CSRF 令牌作为X-CSRF-Token授权标头。

    我在https://fractalideas.com/blog/making-react-and-django-play-well-together-single-page-app-model上阅读,他们为此在后端创建了一个专用端点,他们解释说不是安全漏洞。

你有什么想法?

4

1 回答 1

2

你是对的。

只要满足以下两个条件,您就需要 CSRF 保护:

  • 浏览器自动提供身份验证机制(最常见的方法是使用 cookie)
  • 该操作在您的后端改变状态

在您的三个端点中,只有一个满足这两个条件。

GET /players/: get 不是改变状态的操作。不需要 CSRF 保护。

POST /player/1/:cookie提供的认证;post 是状态变化的。需要 CSRF 保护!

POST /login/:浏览器不会自动提供认证信息;它来自用户有意输入并提交的数据。不需要 CSRF 保护。

你会发现其他的思想流派——这个其他堆栈溢出帖子表明存在侵犯隐私攻击的可能性,但在我看来,所描述的方法有点让人轻信。无论如何你是对的——如果你的前端和后端由完全不同的服务器提供服务,那么在用户登录之前你的前端将没有 CSRF 令牌。

于 2020-03-31T00:27:16.643 回答