Пользователь получает сеанс от другого вошедшего в систему пользователя с помощью Rails / Devise - PullRequest
2 голосов
/ 19 мая 2019

Я использую Devise с Ruby on Rails для разработки игры.

Пользователи могут войти в систему и присоединиться к игре.

При первом входе все нормально - это видночто они вошли как ожидаемый человек.

Но очень редко я замечал (как в реальном мире, так и один раз в тестировании) ситуацию, которая меня поражает.

Внезапно один изпользователи «становятся» другим пользователем.Как будто они вошли в систему как другой пользователь.Они имеют полный доступ к своей учетной записи, и Rails считает, что они вошли в систему как другой пользователь.Все, такие как «current_user.name» и «current_user.email», принадлежат другому пользователю, тому, к которому они ранее не входили, и пользователю, которому они не разрешены.

Iне могу понять, откуда в моем коде это может быть.Я не хочу публиковать здесь весь мой код, поэтому я надеялся на мозговой штурм , как можно было бы даже вызвать что-то подобное в моем коде - или я более вероятенглядя на ошибку devise, когда devise портит сессию, которую он возвращает при определенных условиях гонки?

С последним немного сложнее иметь дело с точки зрения общей безопасности для любого сайта, который использует devise, но я полагаю, что кто-то ещевидел бы это сейчас.Поэтому я полагаю, что это должно быть в моем коде - но нигде в моем коде я не касаюсь информации о сеансе, и при этом я никогда не делаю ничего странного, например, присваиваю current_user чему-либо.

Чтобы было очень ясно, что происходит:

  1. «Боб» регистрируется на своем устройстве как «Боб» и видит, что он «Боб» (current_user.name) и имеет доступ к вещам «Боба».
  2. »Джо "входит в систему на своем устройстве как" Джо "и видит, что он" Джо "(current_user.name) и имеет доступ к вещам" Джо ".
  3. После перехода по одному из любого количества внутренних ссылок (чтоне изменяйте / не устанавливайте информацию о пользователе), устройство, которое использует «Джо», теперь отображается как «Боб» (current_user.name) и имеет доступ к вещам «Боба» (например, редактирование страницы своего профиля и т. д. -все защищено current_user).

Есть мысли о том, чего мне не хватает?

Мои настройки устройства позволяют входить по электронной почте / паролю, а также через oauth через Facebook и т.п.

-

В соответствии с просьбой, приведено следующее описание устройства:

-

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 Ответ

2 голосов
/ 19 мая 2019

Есть несколько способов, которыми это может произойти, очевидно, отсюда трудно сказать, что происходит не так. Поскольку Devise протестирован в бою, я бы предположил, что это то, что вы делаете, а не устройство (конечно, все еще возможно, что у Devise есть ошибка, но, скорее всего, ваш код содержит ошибки)

У вас есть

  • Статические переменные, которые содержат информацию, связанную с пользователем
  • Имена пользователей, которые не являются уникальными (применяются на уровне БД)
  • Пользователи с одним и тем же адресом электронной почты, созданные с помощью различных механизмов регистрации
  • Что-нибудь изменилось в обработке сеанса?

Можете ли вы найти способ локального воспроизведения ошибки? Возможно, с помощью сценария, который регистрируется как разные пользователи и проверяет, что пользователь остается прежним. С каким сервером это происходит? Какой магазин сессий вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...