javascript - 这可以成为捍卫 csrf 的策略吗?(双重提交cookie)
问题描述
使用框架:nuxt.js + spring boot(api)
- 首次访问页面时调用一次 api 以生成随机值并设置 httpOnly cookie(例如 key=csrfToken)。
- api 响应也存储在 vuex 中。(响应也有令牌正文。带有 Set-Cookie 标头。)
- 使用 axios 请求时,如果有 "csrfToken" cookie,则在请求中添加自定义标头(例如 key=CSRF_TOKEN_HEADER)。
- 在服务器中,如果传递了 csrfToken cookie,则查找自定义标头值以比较它们以查看它们是否相同。
我知道 $store 本身并不安全。但是,我认为 CSRF 是可防御的,因为无法从外部站点访问 $store。
如果我有什么问题,请告诉我。
解决方案
使用 axios 请求时,如果有 "csrfToken" cookie,则在请求中添加自定义标头(例如 key=CSRF_TOKEN_HEADER)。
由于 cookie 是 httpOnly,因此您无法判断是否存在。
CSRF 攻击通过欺骗用户发出他们不打算发出的请求来起作用。
执行此操作的传统方法是在攻击网站上有一个表单,该表单已action
发送到被攻击的网站。提交该表单时,请求来自用户的浏览器,并包含目标网站的所有用户 cookie。
对此的防御是要求请求包含攻击站点无法知道的信息。CSRF 令牌。
由于攻击站点无法从用户的 cookie 或站点的会话存储(取决于它的存储位置)或其他任何地方读取该令牌,因此它们无法将其包含在表单数据中。
但是您没有使用常规的表单提交。您正在使用 JavaScript 发出请求。
您需要做的就是强制对请求进行预检(例如,通过将Content-Type
请求标头设置为application/json
并在正文中包含 JSON 有效负载)。
这将强制来自攻击站点的请求发出预检请求。您的服务器不会将攻击者列入白名单。因此,浏览器将永远不会发出攻击请求。
如果攻击者尝试发出未预检的请求,它将没有 JSON 有效负载,因此您的服务器可以将其视为格式错误而拒绝。
推荐阅读
- java - 如何从另一个类调用一个方法,该类具有准备调用同一类中的两个方法的 switch 语句?
- database - 错误:ORA-12154:TNS:无法解析指定的连接标识符 (SQL*Plus)
- java - 哪个字符集用于 Apache Jackrabbit Filevault FS 中的文件名编码?
- node.js - 从节点 js 中的另一个文件调用一个 js 文件时遇到问题?
- python - 如何在odoo 11中使用widget =“priority”使选择字段不可悬停或只读
- html - 具有从阴影创建的边框的剪辑路径的边框半径
- javascript - chrome扩展在开发过程中突然不再工作了
- c++ - 快速检查如何获取自定义类型的输出?
- arrays - D3.js 节点从数组中设置 bgcolor 但从不相邻
- shopify - 购买与商店购物车不同的按钮购物车