rest - 我是否需要对/登录端点进行 CSRF 保护?

标签 rest authentication csrf csrf-token

我知道

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

甚至像 https://github.com/pillarjs/understanding-csrf 这样的项目多年来已被放弃并且没有回答新的问题和疑虑,例如 this .

问题

假设我有:

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

我的后端是一个简单的 Nodejs 应用程序,具有这些休息端点:

  1. POST/登录:

    1. 接受 JSON 正文,例如:{"username": "myname", "password": "mypass"}
    2. 验证凭据
    3. 如果确定给出 200 并创建一个带有 session 的 cookie
    4. 如果NOT给出401
  2. 获取/玩家:

    1. 检查 cookie 中的 session
    2. 如果确定给出 200 {"players": "[...]"}
    3. 如果NOT给出401
  3. POST/player/1:

    1. 检查 cookie 中的 session
    2. 如果确定给出 200 并编辑玩家
    3. 如果NOT给出401

我的前端应用程序有:

  1. /login 页面,包含用于发出 POST 的表单(带有用户名密码 字段) > 请求 back.domain.com/login

  2. /playersback.domain.com/players 请求 GET 请求

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

问题

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

    我认为是的,我需要,因为攻击者可以从 malicious.site.com< 向 back.domain.com/player/1 发出请求 并使用我的 session cookie 来编辑播放器,因为我已在我的 domain.com 上登录(并且我仍然有 session cookie)。

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

    1. 在这种情况下,我的浏览器中仍然没有任何 session Cookie。
    2. 而且我也不知道从哪里获取 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/

相关文章:

spring-mvc - 在Spring MVC上使用Servlet 3.0的MultipartConfig

Spring MVC注解 Controller 方法,无法进行DELETE操作的 "find"方法

java - 带有 ASP.NET REST 客户端的 Jersey Java 服务

linux - 登录操作需要很长时间(Syslog 问题)

Laravel CSRF 在 nginx 后面带有 SSL 负载平衡

django - 通过 Postman 发送 CSRF token

javascript - 使用 REST API 在 ExpressJS 和 AngularJS 中上传文件

xml - 为 json 和 xml 的 Restful 端点设置 Spring MVC

javascript - 如何使用已有的 REST API 后端在 Angular 应用程序中实现登录系统

php - 创建注册和登录页面