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 ;)
August 22, 2010 — 09:47
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
August 22, 2010 — 13:37
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.