2011-01-27 3 views
15

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

ответ

12

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

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

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

+0

я вообще согласен с этот ответ, но стоит отметить ответ @rbhitchcock ниже, в частности ссылку на руководство по безопасности для фиксации сеанса. –

7

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

temp = session 
reset_session 
session.reverse_merge!(temp) 

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

+0

Действительно ли это работает? С Rails 2, когда я пытаюсь получить данные из сеанса, вызывая reset_session и переназначая данные обратно на сеанс, при следующем запросе все пропало. –

13

Ruby on Rails Security Guide рекомендует сбросить идентификатор сеанса при успешной аутентификации для защиты от session fixation уязвимостей. По сути, фиксация сеанса подразумевает, что злоумышленник устанавливает ваш идентификатор сеанса (или какой-либо другой способ узнать, что представляет собой идентификатор при нажатии на страницу входа в систему), и после успешной аутентификации злоумышленник устанавливает 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 при выходе из системы, да, это также лучшая практика.

+2

В Rails 5 'session.replace' больше не будет работать. Однако вы можете получить старые значения с помощью 'old_values ​​= session.to_hash' и восстановить их на новый сеанс с помощью' session.update (old_values) '. – Ritchie

+0

@Ritchie Не копируется ли 'session_id'? Это намеренно? – Tallboy

+0

Нет, ты прав. Я не уверен, какой вред он делает. Давайте изменим его как 'old_values ​​= session.to_hash' и 'session.update old_values.except ('session_id')'. – Ritchie

0

Многие ответы здесь не устарели из-за изменения API Rails, поэтому я останусь здесь, что работает как минимум с Rails 5.0.

Как другие отметили руководство по безопасности Rails recommends, вызывающее reset_session при входе во избежание атак сеансовой фиксации.

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

def mitigate_session_fixation 
    old_values = session.to_hash 
    reset_session 
    session.update old_values.except('session_id') 
end 
Смежные вопросы