Ruby on Rails, reset_session i utrata zawartości sesji

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 ;)

Categories: Rails, Ruby

2 Comments

  1. czy jeśli używam autologica, także jest to wymagane ? obecnie moja metoda do wylogowania wyglada tak

    def destroy
    if @user_session = UserSession.find
    @user_session.destroy
    flash[:notice] = t(‘user_session.logged_out’), {:timeout => 3}
    redirect_to root_url
    end
    end

  2. Samego authlogica nie używałem, jednak z tego co wiem nie wywołuje reset_session. Niemniej jednak nic nie stoi na przeszkodzie aby użyć go także na “własną” rękę, ot ew. wzrośnie ilość sesji “zombie” do wyczyszczenia garbage collectorem ;) Skoro i tak usera wylogowujesz, to nic nie stoi na przeszkodzie żeby tak zrobić.

    Sprawdziłbym przy logowaniu czy następuje reset sesji, session fixation nie jest aż tak popularnym atakiem, jednak lepiej zawsze dmuchać na zimne. Dla pewności zawsze w “krytycznych” momentach warto zresetować sesję, nie kosztuje to wiele wysiłku a może pozwolić uniknąć wielu problemów.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑