1

是否可以在使用 ember-simple-auth 设计的同时通过 cookie_store 实现 Rails csrf?

像这样指南总是停用Rails.application.config.session_store,据我了解,这不允许 Rails 跟踪 csrf 令牌,这会导致 Rails 失去对 sessiong 的跟踪。在尝试了许多解决方案后,包括:

  1. require jquery_ujs在 Rails 宣言上。
  2. Rails.application.config.session_store :disabled.
  3. https://github.com/abuiles/rails-csrf
  4. 更改Ember.js 适配器以附加 CSRF。

最终结果仍然几乎相同:

如果protect_from_forgery 设置为:exception 而不是:null_session,则无法验证CSRF 令牌真实性后跟完成的422 Unprocessable Entity 。

交易示例:

部分请求标题:

X-CSRF-Token:1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ==

响应者标题

   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 被禁用......

4

1 回答 1

1

更新!

在了解了有关 CSRF 保护和 Ember-Cli-Rails 的更多信息后,下面的答案在本质上是错误的。


这里的想法是有两个存储:一个仅用于由 Rails 维护的 csrf 令牌的基于 cookie 的存储,以及一个由 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 请求一起发送,仅用于管理员请求,以便进一步验证后端,因为您永远无法信任前端。
  • 还有什么?这些是我所知道的。

现在进入实际方法:

  1. Rails.application.config.session_store :csrf_cookie_store, key: '_xxxxx_id', httponly: falsesession_store.db上设置 。
  2. 在 lib 下创建csrf_cookie_store并在 application.rb 上使用 require 'csrf_cookie_store'.
  3. protect_from_forgery with: :exceptionapplication.rb上设置。
  4. 创建一个TokenController来处理验证。
  5. TokenSerializer以便只发回电子邮件。
  6. 更新您的设计会话控制器以在登录时更改令牌并在会话销毁时跳过真实性令牌验证。
  7. 检查您的路线是否仅创建令牌并进行自定义设计会话。
  8. 创建 Ember.js令牌模型
  9. 将您的SessionAccount与我创建的内容相匹配。
  10. 更新您的Devise Authenticator以在会话失效时向服务器发送删除请求。
  11. 测试一下。
于 2016-03-21T04:56:02.670 回答