egg csrf token 问题请教
发布于 3 年前 作者 PeakFish 2225 次浏览 来自 问答

有一个主项目 前端后端在一起。 react 服务端渲染,部署在根目录,egg 作为后端,开启了 csrf。

最近又写了一个 admin 项目,用的是 antd pro 那一套,纯前端项目,部署在 /admin/ 目录下。

admin 纯前端项目, 接口就写在了主项目里面。

域名是同一个 , 主项目地址是 abc.com/xxx ,admin 项目是 abc.com/admin/xxx , 由于 admin 主要是内部使用,访问过主项目 cookie 就种上了。但是 还是会报 csrf token 错误, 想请教一下这个是什么原因

4 回复

请教一下大佬 @atian25

csrf 的防范方式是 Double Cookie Defense ,原理就是:

  • 访问时在服务端生成一个 csrf,这个 csrf 会被渲染到页面,并写入 cookies
  • 前端 ajax 请求的时候,要带上这个 csrf(通过页面或 cookie 获取到),放在请求的 query 或 header 里面。
  • 服务端收到 ajax 请求时,校验请求带上的 csrf 和 cookie 里面的 csrf 是否相同。

https://eggjs.org/zh-cn/core/security.html#ajax-请求

你是 2 个 egg 项目部署到同一个域名不同的 path 下? 猜测是因为 config.keys 不一样,这个会导致 cookie 的 sign 不一样,从而 a 服务注入的 cookie 在 b 服务那边解析失败,所以读不出 csrf 来。

admin 是纯前端?你的 ajax 请求没把 csrf 带上吧?需要手动操作,文档有写的,多看文档。

@atian25 多谢,想起来 之前是手动带上的,这次忘了

回到顶部