/ login端点是否需要CSRF保护?

时间:2019-09-29 17:29:16

标签: rest authentication csrf csrf-token

我知道

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

https://github.com/pillarjs/understanding-csrf这样的项目,甚至this之类的项目都已经被放弃,并且没有回答新的问题和疑问。

问题

假设我有:

  • back.domain.com
  • 上的后端
  • front.domain.com上的前端。

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

  1. POST /login

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

    1. 检查cookie中的会话
    2. 如果确定,如果{{players}:“ [...]”}中给出200,则
    3. 如果给出401
  3. POST /player/1

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

我的前端应用程序具有:

  1. /login页的表单(包含usernamepassword字段),用于向POST

    < / li>
  2. back.domain.com/login,它向/players

  3. 请求GET
  4. back.domain.com/players发出POST请求的按钮

问题

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

    我认为是,我需要,因为攻击者可以从back.domain.com/player/1back.domain.com/player/1发出请求,并使用我的会话Cookie来编辑播放器,因为我已经登录了(并且我的malicious.site.com上仍然有一个会话Cookie。

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

    1. 在这种情况下,我的浏览器中仍然没有任何会话cookie。
    2. 而且我也不知道从哪里获得back.domain.com/login授权标头的CSRF令牌。

    我读过https://fractalideas.com/blog/making-react-and-django-play-well-together-single-page-app-model,他们为此在后端创建了专用端点,而they explain并不是安全漏洞。

您如何看待?

1 个答案:

答案 0 :(得分:1)

您是正确的。

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

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

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

GET /players/:获取不是状态更改操作。无需CSRF保护。

POST /player/1/:由cookie提供的身份验证;职位正在改变状态。需要CSRF保护!

POST /login/:浏览器未自动提供身份验证信息;它来自用户有意输入并提交的数据。无需CSRF保护。

您会发现其他思想流派-this other stack overflow post表示可能会发生侵犯隐私的攻击,但我认为所描述的方法有点让人怀疑。无论如何,您都是对的-如果前端和后端由完全不同的服务器提供服务,则在用户登录之前,前端将没有CSRF令牌。