我知道
这个问题已经被问过很多次了,但经过几个小时的搜索,我仍然没有明确的答案。
甚至像 https://github.com/pillarjs/understanding-csrf 这样的项目多年来已被放弃并且没有回答新的问题和疑虑,例如 this .
问题
假设我有:
back.domain.com
上的后端和front.domain.com
上的前端。
我的后端是一个简单的 Nodejs 应用程序,具有这些休息端点:
POST/登录
:- 接受 JSON 正文,例如:
{"username": "myname", "password": "mypass"}
- 验证凭据
- 如果确定给出 200 并创建一个带有 session 的 cookie
- 如果NOT给出401
- 接受 JSON 正文,例如:
获取/玩家
:- 检查 cookie 中的 session
- 如果确定给出 200 {"players": "[...]"}
- 如果NOT给出401
POST/player/1
:- 检查 cookie 中的 session
- 如果确定给出 200 并编辑玩家
- 如果NOT给出401
我的前端应用程序有:
/login
页面,包含用于发出POST
的表单(带有用户名
和密码
字段) > 请求back.domain.com/login
/players
向back.domain.com/players
请求GET
请求向
back.domain.com/player/1
发出POST
请求的按钮
问题
在这种情况下我需要 CSRF 保护吗?
我认为是的,我需要,因为攻击者可以从
malicious.site.com< 向
并使用我的 session cookie 来编辑播放器,因为我已在我的back.domain.com/player/1
发出请求domain.com
上登录(并且我仍然有 session cookie)。当我第一次登录
back.domain.com/login
时,我是否需要 CSRF 保护(例如X-CSRF-Token
header )?- 在这种情况下,我的浏览器中仍然没有任何 session Cookie。
- 而且我也不知道从哪里获取
X-CSRF-Token
授权 header 的 CSRF token 。
我继续阅读https://fractalideas.com/blog/making-react-and-django-play-well-together-single-page-app-model他们正在为此在后端创建一个专用端点 they explain这不是一个安全漏洞。
你觉得怎么样?
最佳答案
你是对的。
只要满足以下两个条件,您就确实需要 CSRF 保护:
- 浏览器会自动提供身份验证机制(最常见的方式是使用 cookie)
- 该操作会在您的后端更改状态
在您的三个端点中,只有一个端点满足这两个条件。
GET/players/
:get 不是状态更改操作。不需要 CSRF 保护。
POST/player/1/
:由cookie提供的身份验证; post 是状态改变的。需要CSRF保护!
POST/login/
:浏览器不会自动提供身份验证信息;它来自用户有意输入并提交的数据。不需要 CSRF 保护。
您会发现其他思想流派 - this other stack overflow post表明存在侵犯隐私攻击的可能性,但在我看来,所描述的方法有点令人难以置信。无论如何,你是对的 - 如果你的前端和后端由完全不同的服务器提供服务,那么在用户登录之前,你的前端将不会拥有 CSRF token 。
关于rest - 我是否需要对/登录端点进行 CSRF 保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157580/