CNode

egg csrf token 问题请教

问答
PPeakFish发布于5 年前最后回复5 年前4 回复3856 浏览0 收藏

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

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

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

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

查看回复

回复 (4)

P
PeakFish#1·5 年前

请教一下大佬 @atian25

A
atian25#2·5 年前

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-%E8%AF%B7%E6%B1%82

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

A
atian25#3·5 年前

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

参与回复
登录后即可参与回复。登录