这个问题已经被问过很多次了,但是经过数小时的搜索,我仍然没有明确的答案。
像https://github.com/pillarjs/understanding-csrf这样的项目,甚至this之类的项目都已经被放弃,并且没有回答新的问题和疑问。
假设我有:
back.domain.com
和front.domain.com
上的前端。我的后端是一个简单的具有以下其余端点的nodejs应用程序:
POST /login
:
{"username": "myname", "password": "mypass"}
GET /players
:
POST /player/1
:
我的前端应用程序具有:
/login
页的表单(包含username
和password
字段),用于向POST
back.domain.com/login
,它向/players
GET
向back.domain.com/players
发出POST
请求的按钮
在这种情况下我需要CSRF保护吗?
我认为是,我需要,因为攻击者可以从back.domain.com/player/1
向back.domain.com/player/1
发出请求,并使用我的会话Cookie来编辑播放器,因为我已经登录了(并且我的malicious.site.com
上仍然有一个会话Cookie。
我第一次登录domain.com
时是否需要CSRF保护(例如X-CSRF-Token
标头)?
back.domain.com/login
授权标头的CSRF令牌。我读过https://fractalideas.com/blog/making-react-and-django-play-well-together-single-page-app-model,他们为此在后端创建了专用端点,而they explain并不是安全漏洞。
您如何看待?
答案 0 :(得分:1)
您是正确的。
只要满足以下两个条件,就需要CSRF保护:
在您的三个端点中,只有一个同时满足这两个条件。
GET /players/
:获取不是状态更改操作。无需CSRF保护。
POST /player/1/
:由cookie提供的身份验证;职位正在改变状态。需要CSRF保护!
POST /login/
:浏览器未自动提供身份验证信息;它来自用户有意输入并提交的数据。无需CSRF保护。
您会发现其他思想流派-this other stack overflow post表示可能会发生侵犯隐私的攻击,但我认为所描述的方法有点让人怀疑。无论如何,您都是对的-如果前端和后端由完全不同的服务器提供服务,则在用户登录之前,前端将没有CSRF令牌。