CSRF 令牌 session_store 与 ember-simple-auth 一起设计
CSRF token session_store with ember-simple-auth alongside Devise
是否可以在使用ember-simple-auth Devise的同时通过cookie_store实现Rails csrf?
这样的指南 one 总是停用 Rails.application.config.session_store
,根据我的理解,这不允许 Rails 跟踪 csrf 令牌,这会导致 Rails 失去对会话的跟踪g .在尝试了许多解决方案后,包括:
require jquery_ujs
Rails 宣言。
Rails.application.config.session_store :disabled
.
- https://github.com/abuiles/rails-csrf.
- Changing Ember.js 附加 CSRF 的适配器。
最终结果还是差不多:
无法验证 CSRF 令牌真实性 后跟 Completed 422 Unprocessable Entity 如果 protect_from_forgery 设置为 :exception的:null_session。
示例交易:
部分请求HEADER:
X-CSRF-Token:1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ==
回复者HEADER
HTTP/1.1 422 Unprocessable Entity
Content-Type: text/plain; charset=utf-8
X-Request-Id: 71e94632-ad98-4b3f-97fb-e274a2ec1c7e
X-Runtime: 0.050747
Content-Length: 74162
The response also attaches the following:
Session dump
_csrf_token: "jFjdzKn/kodNnJM0DXLutMSsemidQxj7U/hrGmsD3DE="
来自我的 csrf 分支 的 rails-csrf 响应(分支已被删除)。
beforeModel() {
return this.csrf.fetchToken();
},
Partial dump of the return statement:
_result: Object
param: "authenticity_token"
token: "1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ=="
根据我的理解,所有这些尝试的解决方案都有一个共同的根源:session_store is disabled...
更新!
在进一步了解 CSRF 保护和 Ember-Cli-Rails.
后,下面的答案本质上是错误的
这里的想法是有两个存储:一个基于 cookie 的存储,仅用于由 Rails 维护的 csrf 令牌,以及一个由 Ember-simple-auth 维护的本地存储,其中用户真实性令牌、电子邮件和 ID 正在处理,而自定义会话 SessionAccount 继承这些值并在设置将可用于整个 Ember.js.
的用户之前针对服务器验证它们
SessionAccount 的验证是为了检测对 localStorage 的任何篡改。每次 SessionAccount 查询 localStorage(例如页面重新加载)时都会进行验证,因为它通过令牌模型(令牌、电子邮件和 ID)与服务器通信。服务器通过 TokenSerializer 响应 200 或 404,它只呈现电子邮件或验证错误,因此不会公开前端以查看其他 authentication_tokens 除非用户通过需要电子邮件和密码的登录表单登录。
根据我的理解,这种方法中的弱点不太容易被破解,除非:
- 有人入侵服务器,获取数据库内容。尽管密码是加盐的,但任何拥有数据库转储的人都可以将 localStorage 令牌、电子邮件和 ID 更改为他们想要模拟的人,并且服务器验证将起作用。但是,这可以通过工作人员每 24 小时(或任何其他时间范围)更改未登录用户的身份验证令牌来最小化。代码示例部分目前没有工作人员,因为我还没有了解他们。
- 有人知道他们想要破解的人的密码和电子邮件...目前我对此无能为力。
- 有人拦截了通过 JSON API 传递的数据。强大的 SSL 实施应该做得很好。
- 如果您的 sessionAccount 在 is_Admin 行中有内容,则可以将令牌与 POST 请求一起发送给仅管理员请求,以便进行进一步的后端验证,因为您永远无法信任前端。
- 还有别的吗?这些是我知道的。
现在进入实用方法:
- 设置
Rails.application.config.session_store :csrf_cookie_store, key: '_xxxxx_id', httponly: false
在 session_store.db.
- 在 lib 下创建 csrf_cookie_store 并在 application.rb 上使用
require 'csrf_cookie_store'
要求它。
- 在 application.rb 上设置
protect_from_forgery with: :exception
。
- 创建一个 TokenController 来处理验证。
- TokenSerializer 这样只发回电子邮件。
- 更新您的 Devise Session controller 以在登录时更改令牌并在会话销毁时跳过真实性令牌验证。
- 检查您的 routes 是否仅创建令牌并进行自定义 Devise 会话。
- 创建 Ember.js Token Model
- 将你的 SessionAccount 与我创建的相匹配。
- 更新您的 Devise Authenticator 以在会话失效时向服务器发送删除请求。
- 测试一下。
是否可以在使用ember-simple-auth Devise的同时通过cookie_store实现Rails csrf?
这样的指南 one 总是停用 Rails.application.config.session_store
,根据我的理解,这不允许 Rails 跟踪 csrf 令牌,这会导致 Rails 失去对会话的跟踪g .在尝试了许多解决方案后,包括:
require jquery_ujs
Rails 宣言。Rails.application.config.session_store :disabled
.- https://github.com/abuiles/rails-csrf.
- Changing Ember.js 附加 CSRF 的适配器。
最终结果还是差不多:
无法验证 CSRF 令牌真实性 后跟 Completed 422 Unprocessable Entity 如果 protect_from_forgery 设置为 :exception的:null_session。
示例交易:
部分请求HEADER:
X-CSRF-Token:1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ==
回复者HEADER
HTTP/1.1 422 Unprocessable Entity
Content-Type: text/plain; charset=utf-8
X-Request-Id: 71e94632-ad98-4b3f-97fb-e274a2ec1c7e
X-Runtime: 0.050747
Content-Length: 74162
The response also attaches the following:
Session dump
_csrf_token: "jFjdzKn/kodNnJM0DXLutMSsemidQxj7U/hrGmsD3DE="
来自我的 csrf 分支 的 rails-csrf 响应(分支已被删除)。
beforeModel() {
return this.csrf.fetchToken();
},
Partial dump of the return statement:
_result: Object
param: "authenticity_token"
token: "1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ=="
根据我的理解,所有这些尝试的解决方案都有一个共同的根源:session_store is disabled...
更新!
在进一步了解 CSRF 保护和 Ember-Cli-Rails.
后,下面的答案本质上是错误的这里的想法是有两个存储:一个基于 cookie 的存储,仅用于由 Rails 维护的 csrf 令牌,以及一个由 Ember-simple-auth 维护的本地存储,其中用户真实性令牌、电子邮件和 ID 正在处理,而自定义会话 SessionAccount 继承这些值并在设置将可用于整个 Ember.js.
的用户之前针对服务器验证它们SessionAccount 的验证是为了检测对 localStorage 的任何篡改。每次 SessionAccount 查询 localStorage(例如页面重新加载)时都会进行验证,因为它通过令牌模型(令牌、电子邮件和 ID)与服务器通信。服务器通过 TokenSerializer 响应 200 或 404,它只呈现电子邮件或验证错误,因此不会公开前端以查看其他 authentication_tokens 除非用户通过需要电子邮件和密码的登录表单登录。
根据我的理解,这种方法中的弱点不太容易被破解,除非:
- 有人入侵服务器,获取数据库内容。尽管密码是加盐的,但任何拥有数据库转储的人都可以将 localStorage 令牌、电子邮件和 ID 更改为他们想要模拟的人,并且服务器验证将起作用。但是,这可以通过工作人员每 24 小时(或任何其他时间范围)更改未登录用户的身份验证令牌来最小化。代码示例部分目前没有工作人员,因为我还没有了解他们。
- 有人知道他们想要破解的人的密码和电子邮件...目前我对此无能为力。
- 有人拦截了通过 JSON API 传递的数据。强大的 SSL 实施应该做得很好。
- 如果您的 sessionAccount 在 is_Admin 行中有内容,则可以将令牌与 POST 请求一起发送给仅管理员请求,以便进行进一步的后端验证,因为您永远无法信任前端。
- 还有别的吗?这些是我知道的。
现在进入实用方法:
- 设置
Rails.application.config.session_store :csrf_cookie_store, key: '_xxxxx_id', httponly: false
在 session_store.db. - 在 lib 下创建 csrf_cookie_store 并在 application.rb 上使用
require 'csrf_cookie_store'
要求它。 - 在 application.rb 上设置
protect_from_forgery with: :exception
。 - 创建一个 TokenController 来处理验证。
- TokenSerializer 这样只发回电子邮件。
- 更新您的 Devise Session controller 以在登录时更改令牌并在会话销毁时跳过真实性令牌验证。
- 检查您的 routes 是否仅创建令牌并进行自定义 Devise 会话。
- 创建 Ember.js Token Model
- 将你的 SessionAccount 与我创建的相匹配。
- 更新您的 Devise Authenticator 以在会话失效时向服务器发送删除请求。
- 测试一下。