web-dev-qa-db-fra.com

Rails 4: Expiration de la session?

Je viens de passer de Rails 3.2 à Rails 4. J'essaie de faire en sorte d'être le plus rapide possible sur les questions de sécurité, et je suis préoccupé par les sessions en ce moment. Il semble que Rails 4 ait cessé de prendre en charge toutes les sessions SAUF SAUF les sessions basées sur les cookies, mais il semble qu'il ne soit pas possible d'empêcher les sessions basées sur des cookies de vivre pour toujours. J'ai lu plusieurs articles, mais celui-ci est le plus officiel: http://guides.rubyonrails.org/security.html#session-expiry . Notez comment ils soulignent qu'il s'agit d'un problème pour les sessions basées sur les cookies, puis ils la corrigent pour les sessions basées sur une base de données (qui sont maintenant apparemment obsolètes).

Je suis vraiment confus. Je veux pouvoir empêcher un attaquant d'obtenir un cookie lui donnant un accès permanent à mon site protégé par un login. Évidemment, je peux définir: expire_after dans initializers/session_store.rb, mais à moins que je ne me trompe, il définit simplement l'expiration du cookie qui est côté client et facilement modifié par un attaquant afin que la session puisse durer éternellement. Bien sûr, je peux améliorer les choses en forçant SSL, en utilisant des cookies sécurisés et en forçant uniquement HTTP, mais cela ne sera jamais une défense complète tant que je ne pourrai pas imposer l'expiration de la session.

Comment puis-je résoudre ce problème lorsque Rails décourage les seuls moyens d’organiser des sessions côté serveur?

Je sais que les sessions d'enregistrement actives ont été déplacées dans une gemme et sont toujours disponibles, mais il n'en reste pas moins qu'elles sont déconseillées. Une solution devrait être possible sans introduire plus de dépendances, ou à tout le moins sans utiliser de fonctionnalités obsolètes.

28
Kyle

Rails propose des cookies de session "inviolables". Pour empêcher toute modification de hachage de session, un résumé est calculé à partir de la session avec un secret côté serveur et inséré à la fin du cookie. Assurez-vous d'avoir un long secret. Si vous souhaitez réinitialiser périodiquement toutes les sessions utilisateur, changez votre secret.

Pour répondre à votre question, si vous souhaitez ajouter un délai supplémentaire aux données de session, vous pouvez effectuer les tâches suivantes:

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

Ensuite, lors de l'authentification des utilisateurs, procédez comme suit:

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

J'espère que cela pourra aider.

39
Patrick Reiner

En réalité, Rails hérite du Rack::Session::Cookie. Vous pouvez donc configurer le paramètre expire_after dans votre session_store.rb.

Sqore::Application.config.session_store(
  :cookie_store,
  key: '_name_session',
  expire_after: 24.hours
)
34
Nerform

ajoutez ceci à votre contrôleur d'application: before_filter: session_expires,: except => [: login,: logout] .__ 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
A.lakkantha