Вход в Rails Reset Session

Лучше ли использовать вызов reset_session, когда пользователь успешно выполняет вход и вызывается снова, когда пользователь подписывается? Есть ли побочные эффекты/проблемы для этого?

Ответы

Ответ 1

Это действительно зависит от того, как вы храните вещи в сеансе и как вы хотите, чтобы безопасность работала.

Сеанс

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

Если вы не храните какие-либо данные, которые, как вы считаете, могут захотеть удержать, я знаю, что нет причин, позволяющих очистить сеанс до того, как будет обработана попытка входа в систему. Я рекомендую его. p >

Ответ 2

Руководство по безопасности Ruby on Rails рекомендует сбросить идентификатор сеанса при успешной аутентификации для защиты от фиксация сеанса. По сути, фиксация сеанса подразумевает, что злоумышленник устанавливает ваш идентификатор сеанса (или какой-либо другой способ узнать, что представляет собой идентификатор при нажатии на страницу входа в систему), и после успешной аутентификации злоумышленник устанавливает cookie для своего браузера, используя ваш идентификатор сеанса и впоследствии аутентифицируется как вы. Сброс идентификатора сеанса при успешной аутентификации полностью смягчает такую ​​уязвимость. Пример кода примера в твоем действии может выглядеть так:

def create
  user =  User.find_by_email(params[:email])
  if user && user.authenticate(params[:password])
    temp_session = session.dup
    reset_session
    session.replace(temp_session)
    session[:athlete_id] = athlete.id
    redirect_to root_url, notice: "Authentication successful!"
  else
    flash.now.alert = "Invalid credentials"
    render "new"
  end
end

Обратите внимание, что важно перезапустить сеанс перед его сбросом, если есть какие-либо данные, которые вы хотите сохранить.

Что касается вызова reset_session при выходе из системы, да, это также лучшая практика.

Ответ 3

Я считаю хорошей практикой для reset сеанса, когда пользователь входит в систему. Таким образом, злонамеренные люди не могут вынюхивать свой файл cookie сеанса до того, как клиентское соединение зашифровано и все еще использует его после использования формы входа над https. Попробуйте:

temp = session
reset_session
session.reverse_merge!(temp)

Таким образом, сеанс получает новые значения, сгенерированные с помощью reset_session, но любые другие переменные сеанса остаются неповрежденными.