Rails 4: Wygaśnięcie Sesji?

Właśnie dokonałem zmiany z Rails 3.2 na Rails 4. Staram się być na bieżąco z kwestiami bezpieczeństwa i martwię się o sesje. Wygląda na to, że Rails 4 odsunął się od wspierania naprawdę czegokolwiek, z wyjątkiem sesji opartych na plikach cookie, ale wygląda na to, że nie jest możliwe uniemożliwienie sesjom opartym na plikach cookie życia na zawsze. Czytałem kilka artykułów, ale ten jest najbardziej oficjalny: http://guides.rubyonrails.org/security.html#session-expiry . Zauważ, jak zwracają uwagę, że jest to problem dla sesji opartych na plikach cookie, a następnie dają poprawkę dla sesji bazodanowych (które najwyraźniej są obecnie przestarzałe).

Jestem naprawdę zdezorientowany. Chcę być w stanie uniemożliwić atakującemu uzyskanie pliku cookie, który daje mu stały dostęp do mojej strony chronionej przed logowaniem. Oczywiście mogę ustawić: expire_after w initializers / session_store.rb, ale o ile się nie mylę to po prostu ustawia wygaśnięcie pliku cookie, który jest po stronie klienta i łatwo zmieniany przez atakującego, aby sesja mogła żyć wiecznie. Oczywiście mogę zrobić coś lepszego, wymuszając SSL, używając bezpiecznych plików cookie i wymuszając tylko HTTP, ale nigdy nie będzie to kompletna obrona, dopóki nie będę mógł wymusić wygaśnięcia sesji.

Jak mogę rozwiązać ten problem, gdy Rails deprecjonuje jedyne sposoby na sesje po stronie serwera?

Wiem, że sesje active record zostały przeniesione do klejnotu i nadal są dostępne, ale faktem pozostaje, że został on przestarzały. Rozwiązanie powinno być możliwe bez wprowadzania większej liczby zależności lub przynajmniej bez użycia przestarzałych funkcji.

Author: BartoszKP, 2013-07-05

3 answers

Rails ma" odporne na manipulacje " pliki cookie sesji. Aby zapobiec manipulowaniu hashami sesji, na końcu pliku cookie jest obliczany skrót z sesji z sekretem po stronie serwera i wstawiany. Upewnij się, że masz długi sekret. Jeśli chcesz okresowo resetować wszystkie sesje użytkownika Zmień swój sekret.

Aby odpowiedzieć na twoje pytanie, jeśli chcesz dodać dodatkowy czas do danych sesji, możesz zrobić:

session[:user_id] = user.id
session[:expires_at] = Time.current + 24.hours

Następnie, podczas uwierzytelniania użytkowników, wykonaj:

if session[:expires_at] < Time.current
  # sign out user
end

Mam nadzieję, że pomaga.

 36
Author: Patrick Reiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 07:32:17

Właściwie rails dziedziczy z Rack::Session::Cookie. Możesz więc skonfigurować parametr expire_after w swoim session_store.rb.

Sqore::Application.config.session_store(
  :cookie_store,
  key: '_name_session',
  expire_after: 24.hours
)
 34
Author: Nerform,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 12:04:44

Dodaj to do kontrolera aplikacji: before_filter: session_expires,: except = > [: login,: Wyloguj] before_filter: update_session_time, :except => [:login,: logout]

def session_expires
@time_left = (session[:expires_at] - Time.now).to_i
unless @time_left > 0
reset_session
flash[:error] = 'Lorem Ipsum.'
redirect_to :controller => 'foo', :action => 'bar'
 end
end

 def update_session_time
  session[:expires_at] = 60.minutes.from_now
 end
 1
Author: A.lakkantha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 10:31:27