【发布时间】:2021-04-01 23:12:50
【问题描述】:
过去几天我一直在阅读有关 CSRF 的文章,感觉我对它是什么以及如何预防它有了很好的了解。我正在构建一个小型 Express/React 应用程序,该应用程序将具有用于更新应用程序内容的安全管理区域,并且我希望它免受 CSRF 的影响。
我知道服务器通常会生成 CSRF 令牌,然后将其与已请求的视图(页面)一起发送到客户端(然后可以将令牌隐藏在 HTML 表单输入标记中)。但是,我的 Express API 不提供 HTML,它是一个仅返回 JSON 数据的 REST API。 UI 使用 React 构建,运行在与服务器不同的端口上。
我的问题是;我在哪里可以安全地存储在服务器上生成的令牌?
例如,如果我通过点击“/api/login”以管理员身份登录,生成一个令牌,并在 API 响应中将其发送回客户端,我现在应该如何处理它?
最初的计划是使用 Redux 来存储令牌,但通过阅读 Is Redux secure? 这篇文章,这听起来并不理想。
我考虑过使用 React 环境变量,但也读到这些在构建中公开。
显然 localStorage 也是个坏主意……
我真的很难使用我正在实施的工具(即 Express/React)找到解决此问题的方法
任何帮助、链接、建议、批评都将不胜感激,我想学习在构建应用时考虑到安全性
【问题讨论】:
-
我对 SPA 的偏好是使用 cookie-to-header CSRF 令牌。基本上,只要您的前端可以被您的后端 cookie,您的前端 JS 就能够读取该 cookie 并将其作为单独的标头发送回后端。攻击者无法做到这一点,因为他们看不到 cookie。 typeofnan.dev/…
-
嗨@Nick,感谢您的回复。根据您的评论,我刚刚找到了一个名为 react-cookies 的 npm 包,这是您使用过/会推荐的东西吗?
-
我从未听说过。我相信有一个名为“csurf”的后端节点库,它将创建 CSRF 令牌并可以选择作为 cookie 发送。一些 fetch 库(例如 axios)实际上会自动在 cookie 中找到 CSRF 令牌,并在发送回服务器时将它们转换为 header
-
好的,非常感谢,一旦我找到了一种方法,我会写下这个问题的答案,如果没有人先回答的话。谢谢老哥
标签: javascript reactjs express csrf