【问题标题】:CSRF token session_store with ember-simple-auth alongside Devise带有 ember-simple-auth 和 Devise 的 CSRF 令牌 session_store
【发布时间】:2016-04-22 08:20:18
【问题描述】:

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

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

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

最终的结果还是差不多的:

如果protect_from_forgery 设置为:exception 而不是:null_session,则

无法验证CSRF 令牌真实性,然后是完成的422 无法处理的实体

交易示例:

部分请求标头:

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

【问题讨论】:

    标签: ruby-on-rails-4 ember.js csrf-protection ember-cli-rails


    【解决方案1】:

    更新!

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


    这里的想法是有两个存储:一个仅用于由 Rails 维护的 csrf 令牌的基于 cookie 的存储,以及一个由 Ember-simple-auth 维护的 localStorage,用于获取用户真实性令牌、电子邮件和 id在设置可用于整个 Ember.js 的用户之前,自定义会话 SessionAccount 会继承这些值并针对服务器验证它们。

    通过 SessionAccount 进行验证是为了检测对 localStorage 的任何篡改。每次 SessionAccount 查询 localStorage(例如页面重新加载)时都会发生验证,因为它通过令牌模型(令牌、电子邮件和 ID)与服务器通信。服务器通过仅呈现电子邮件或验证的 TokenSerializer 以 200 或 404 响应错误,因此除非用户通过需要电子邮件和密码的登录表单登录,否则不会公开前端以查看其他 authentication_tokens。

    据我了解,这种方法的弱点不容易被轻易破解,除非:

    • 有人入侵服务器并获取数据库内容。尽管密码是加盐的,但任何拥有数据库转储的人都可以将 localStorage 令牌、电子邮件和 ID 更改为他们想要模拟的人,并且服务器验证将起作用。但是,这可以通过每 24 小时(或任何其他时间范围)更改未登录用户的身份验证令牌的工作人员来最小化。代码示例部分目前没有工作人员,因为我还没有了解它们。
    • 有人知道他们想要破解的人的密码和电子邮件...目前我对此无能为力。
    • 有人拦截了通过 JSON API 传递的数据。一个强大的 SSL 实施应该会做得很好。
    • 如果您的 sessionAccount 在 is_Admin 行中包含某些内容,则可以将令牌与 POST 请求一起发送给仅管理员请求,以便进一步验证后端,因为您永远无法信任前端。
    • 还有别的吗?这些是我知道的。

    现在进入实用方法:

    1. 设置 session_store.db 上的Rails.application.config.session_store :csrf_cookie_store, key: '_xxxxx_id', httponly: false
    2. 在 lib 下创建 csrf_cookie_store 并使用 require 'csrf_cookie_store' 在 application.rb 上要求它。
    3. application.rb 上设置 protect_from_forgery with: :exception
    4. 创建一个TokenController 来处理验证。
    5. TokenSerializer 以便只发回电子邮件。
    6. 更新您的 Devise Session controller 以在登录时更改令牌并在会话销毁时跳过真实性令牌验证。
    7. 检查您的 routes 以获取仅要创建的令牌并具有自定义设计会话。
    8. 创建 Ember.js Token Model
    9. 将您的 SessionAccount 与我创建的内容相匹配。
    10. 更新您的Devise Authenticator,以便在会话失效时向服务器发送删除请求。
    11. 测试一下。

    【讨论】:

    • 我不明白你的更新信息。这是否意味着我们不应该遵循这个已接受答案中描述的步骤?如果你记得你是如何解决这个问题的,你能否用正确的事情来更新它?谢谢。 :)
    • 我很抱歉忘记用我当时实际所做的来更新答案。我不再记得导致答案无效的确切区别是什么,但我相信这与后端为每个人保留 csrf 令牌和会话有关,即使另一个用户登录,也会导致同一个帐户登录。不幸的是问题已解决,您可以在 github.com/Deovandski/Fakktion 上看到它的一个示例。此外,如果您有时间,您可以滚动浏览提交到我声明问题已解决的时间点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多