首页 > 解决方案 > 这可以成为捍卫 csrf 的策略吗?(双重提交cookie)

问题描述

使用框架:nuxt.js + spring boot(api)

  1. 首次访问页面时调用一次 api 以生成随机值并设置 httpOnly cookie(例如 key=csrfToken)。
  2. api 响应也存储在 vuex 中。(响应也有令牌正文。带有 Set-Cookie 标头。)
  3. 使用 axios 请求时,如果有 "csrfToken" cookie,则在请求中添加自定义标头(例如 key=CSRF_TOKEN_HEADER)。
  4. 在服务器中,如果传递了 csrfToken cookie,则查找自定义标头值以比较它们以查看它们是否相同。

我知道 $store 本身并不安全。但是,我认为 CSRF 是可防御的,因为无法从外部站点访问 $store。

如果我有什么问题,请告诉我。

标签: javascriptsecurityvue.jscsrfnuxt.js

解决方案


使用 axios 请求时,如果有 "csrfToken" cookie,则在请求中添加自定义标头(例如 key=CSRF_TOKEN_HEADER)。

由于 cookie 是 httpOnly,因此您无法判断是否存在。


CSRF 攻击通过欺骗用户发出他们不打算发出的请求来起作用。

执行此操作的传统方法是在攻击网站上有一个表单,该表单已action发送到被攻击的网站。提交该表单时,请求来自用户的浏览器,并包含目标网站的所有用户 cookie。

对此的防御是要求请求包含攻击站点无法知道的信息。CSRF 令牌。

由于攻击站点无法从用户的 cookie 或站点的会话存储(取决于它的存储位置)或其他任何地方读取该令牌,因此它们无法将其包含在表单数据中。


但是您没有使用常规的表单提交。您正在使用 JavaScript 发出请求。

这带有一个内置的防御:同源策略预检请求

您需要做的就是强制对请求进行预检(例如,通过将Content-Type请求标头设置为application/json并在正文中包含 JSON 有效负载)。

这将强制来自攻击站点的请求发出预检请求。您的服务器不会将攻击者列入白名单。因此,浏览器将永远不会发出攻击请求。

如果攻击者尝试发出未预检的请求,它将没有 JSON 有效负载,因此您的服务器可以将其视为格式错误而拒绝。


推荐阅读