cookies - 使用会话的带有 API 的 CSRF SPA
问题描述
设置/上下文
我在 Vue.Js 中有一个 SPA,并以 Node 服务器作为后端。我还有一个辅助应用程序,.net core web API。当用户访问 SPA 时,他被迫通过外部身份提供者登录。会话在登录后创建并实际存储在 Web API 上(以 cookie 的形式),而不是 Vue.Js。这意味着如果他已登录,则 SPA 没有上下文,除了调用 API 以查看他是否已登录。我意识到这有点奇怪,但我们实际上并不想在节点服务器上管理会话,所以我们选择这种方法。
CSRF
我想防止 CSRF 攻击。据我发现,我已经看到了两种防止这种情况的方法。
Cookie 上的 SameSite 属性 这不仅仅作为防御机制被信任,因为人们通常不相信 API 会遵守 GET/POST 最佳实践,但如果实施得当并且如果 SPA 和 API 共享一个域,应该就足够了。
反 CSRF 令牌 这个想法是使您的非 GET 请求是唯一的,因此它们不能被伪造。意见不同,但如果它们至少在每个用户的每个会话中是唯一的,它已经增加了好处(与每个请求的唯一性相反,这在 SPA 中还有其他缺点)
我上面的假设是否正确?
在我的设置中添加反 CSRF 令牌是否可能且有用?
由于登录过程使用外部身份提供者(使用 OAUTH),浏览器最终将登陆 API 回调 url,该 URL 将响应 HTTP 302 重定向到带有会话 cookie 的 SPA 主页。通常 CSRF 令牌存储在正文中,这是不可能的,因为我们对另一个站点执行 302。所以我可以: a) 在 url 中返回 CSRF 令牌,这通常很糟糕,因为您不应该将敏感信息放在 url 中,因为它可能会在某处登录时暴露。b) 返回另一个带有 CSRF-token 的 cookie,而不是 HTTP-ONLY。这允许 SPA 从 cookie 中检索值,然后将值发送到 XHR 标头/正文以添加为 CSRF 保护。
我的问题是,在选项 b) 中,这会增加什么吗?由于我暂时公开了 CSRF 值,我不确定这是否会被滥用,或者我是否被迫在此设置中仅依赖 SameSite cookie。
解决方案
推荐阅读
- typescript - 如何访问内联子类型
- sql - 快速 Spark 替代 WHERE 列 IN other_column
- node.js - 如何使用 Node js 将数据发送到 Jasper Report?
- c++ - 调用 curl_easy_init() 时 .DLL 无法注入
- firebase - Firestore DB 和 Firebase Cloud Functions 的不同区域
- windows - 无法在 Windows 上的 perl 中获取系统语言环境
- ios - 如何使用 SwiftUI 在详细视图上编辑和覆盖 CoreData
- class - 抽象类传递对对象的引用
- css - VS Code 仅针对 CSS 更改主题颜色
- java - 使用 FCM 推送通知时颤动中的 Kotlin 文件错误