Ruby on rails 4 CSRF令牌会话存储与ember simple auth并排设计

Ruby on rails 4 CSRF令牌会话存储与ember simple auth并排设计,ruby-on-rails-4,ember.js,csrf-protection,ember-cli-rails,Ruby On Rails 4,Ember.js,Csrf Protection,Ember Cli Rails,在使用ember simple auth Desive的同时,是否可以通过cookie_store实现Rails csrf 像这样的指南总是停用Rails.application.config.session\u store,据我所知,这不允许Rails跟踪csrf令牌,这会导致Rails丢失sessionsg。尝试了许多解决方案后,包括: requirejquery\ujsonrails宣言 Rails.application.config.session\u存储:已禁用 用于附加CSRF的

在使用ember simple auth Desive的同时,是否可以通过cookie_store实现Rails csrf

像这样的指南总是停用
Rails.application.config.session\u store
,据我所知,这不允许Rails跟踪csrf令牌,这会导致Rails丢失sessionsg。尝试了许多解决方案后,包括:

  • requirejquery\ujs
    onrails宣言
  • Rails.application.config.session\u存储:已禁用
  • 用于附加CSRF的Ember.js适配器
  • 最终结果仍然大致相同:

    无法验证CSRF令牌的真实性,如果将protect_from_fackery设置为:exception而不是:null_session,则后面是已完成的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="
    
    来自my csrf分支的rails csrf响应(分支已被删除)

    据我所知,所有这些尝试的解决方案都有一个共同的根:会话存储被禁用…

    Update! 在了解了更多关于CSRF保护和Ember Cli Rails的知识后,下面的答案本质上是错误的。
    这里的想法是有两个存储:一个是仅用于由Rails维护的csrf令牌的基于cookie的存储,另一个是由Ember simple auth维护的本地存储,其中用户真实性令牌,当自定义会话SessionAccount继承这些值并在设置可用于整个Ember.js的用户之前根据服务器验证这些值时,将处理电子邮件和id

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

    据我所知,该方法中的弱点不易受到攻击,除非:

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

  • 设置
    Rails.application.config.session\u store:csrf\u cookie\u store,key:''xxxxx\u id',httponly:false
    session\u store.db
  • 使用
    require'csrf\u cookie\u store'
    在application.rb上创建下库并要求它
  • application.rb上设置
    使用::exception
    防止伪造
  • 创建用于处理验证的
  • 因此,只有电子邮件被发回
  • 更新您的以在登录时更改令牌,并在会话销毁时跳过真实性令牌验证
  • 检查您的令牌是否仅用于创建并具有自定义设计会话
  • 创建Ember.js
  • 将您的配置与我创建的匹配
  • 更新以在会话无效时向服务器发送删除请求
  • 测试一下

  • 我不明白你的最新消息。这是否意味着我们不应该遵循这个公认答案中描述的步骤?如果你还记得你是如何解决这个问题的,你能用正确的事情来更新它吗?谢谢。:)我很抱歉忘记用我当时实际做的事情更新答案。我不再记得导致答案无效的确切区别是什么,但我相信这与后端为每个人保留csrf令牌和会话有关,即使其他用户登录,也会导致同一帐户登录。这个问题很快就解决了,您可以在github.com/Deovandski/Fakktion上看到一个例子。此外,如果您有时间,您可以滚动提交到我声明问题已解决的时间点。
    beforeModel() {
        return this.csrf.fetchToken();
    },
    
    Partial dump of the return statement:
    
    _result: Object
    param: "authenticity_token"
    token: "1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ=="