用户正在使用Rails / Devise从其他已登录用户获取会话

时间:2019-05-19 09:38:41

标签: ruby-on-rails ruby devise

我正在使用Devise和Ruby on Rails开发游戏。

用户可以登录并加入游戏。

第一次登录时,一切都很好-这表明他们以预期的身份登录。

但是我很少(无论是在现实生活中还是在测试中)都发现一种令我感到困惑的情况。

突然,一个用户“成为”另一个用户。好像他们已经以其他用户身份登录一样。他们拥有对帐户的完全访问权限,Rails认为他们已经以其他用户身份登录。诸如“ current_user.name”和“ current_user.email”之类的所有内容均取决于另一位用户,他们以前没有以该用户身份登录过,并且该用户无权成为该用户。

我不知道这可能来自我的代码。我不想在这里发布我的全部代码,所以我希望对 how 进行一些头脑风暴,甚至有可能在我的代码中引起类似的事情-还是我更多可能会看到一个设计错误,在这个错误中,设计会在某些比赛条件下搞砸它返回的会话?

从一般安全性的角度来看,对于使用devise的任何站点而言,后者的处理都有些令人恐惧,但我认为其他人现在可能会看到这种情况。因此,我认为它一定在我的代码中-但是我在代码中的任何地方都不会触及会话信息,也不会做任何奇怪的事情,例如将current_user分配给任何事情。

要非常清楚发生了什么:

  1. “鲍勃”以“鲍勃”的身份登录设备,并发现他是“鲍勃”(current_user.name),并且可以访问“鲍勃”内容。
  2. “ Joe”以“ Joe”身份登录到他的设备,并发现他是“ Joe”(current_user.name)并且可以访问“ Joe”内容。
  3. 跟随任意数量的内部链接之一(不会更改/设置用户信息)之后,“ Joe”正在使用的设备现在显示为“ Bob”(current_user.name),并且可以访问“鲍勃”(例如编辑他的个人资料页面等。-全部由current_user保护)。

对我可能会缺少的东西有什么想法吗?

我的设计设置允许电子邮件/密码登录以及使用Facebook等的oauth登录。

-

根据要求,这是设备迁移:

-

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

1 个答案:

答案 0 :(得分:2)

可以通过多种方式发生这种情况,显然很难从这里判断出问题所在。由于Devise经过了实战测试,因此我认为这是您要做的事情,而不是设备正在做的事情(当然,Devise仍然有可能有bug,但是您的代码有可能有bug)

你有

  • 保存与用户有关的信息的静态变量
  • 不是唯一的用户名(在数据库级别强制执行)
  • 使用不同注册机制创建的具有相同电子邮件地址的用户
  • 更改了会话处理中的任何内容? ?

您能找到一种在本地重现错误的方法吗?也许使用以不同用户身份登录并检查用户身份是否保持不变的脚本。 它与什么服务器一起发生? 您使用什么会话存储?