Logując użytkownika (czy też innego aktora) w systemie, powinniśmy wykonywać reset sesji. Jest to jedno z podstawowych zabezpieczeń przed atakami typu session fixation. Odbywa się to przez wywołanie metody reset_session.

Ma to jednak swoje minusy. Wszystko co mieliśmy w sesji zostanie utracone.

Jest na to jednak bardzo proste rozwiązanie, wystarczy zapamiętać “na chwilę” wartości które mieliśmy w sesji, a następnie je przywrócić. Najprościej będzie to zrobić, nadpisując w naszym kontrolerze (lub kontrolerze po którym dziedziczymy – według potrzeb) metodę reset_session, w taki oto sposób:

  # Resetuje sesję ale zostawiając język i przekierowanie
  def reset_session
    lang = session[:locale]
    url = session[:request_uri]
    super
    session[:request_uri] = url
    session[:locale] = lang
  end

Warto też pamiętać że po wykonaniu resetu, poprzednie ID sesji jest utracone, a wywołanie po resecie metody:

request.session_options[:id]

zakończy się zwróceniem nila.

Z tego powodu lepiej nie bazować na ID sesji, jako kluczu obcym. O wiele lepiej przetrzymywać takie klucze bezpośrednio w sesji (kluczem może być generowany np. na podstawie id sesji + soli, hash) a kiedy trzeba “kopiować” za pomocą sposobu pokazanego powyżej.

Poleganie na ID sesji może skończyć się naprawdę źle ;)