web-dev-qa-db-fra.com

Rails sessions pratiques actuelles

Tout le monde a des conseils sur les "meilleures pratiques" pour Rails et sessions? Le type de session par défaut pour Rails 3 est toujours CookieStore, n'est-ce pas? J'ai utilisé SqlSessionStore pendant un certain temps) et cela a bien fonctionné, mais je peux m'éloigner de cela en faveur de CookieStore.

N'est-ce pas une bonne idée d'utiliser CookieStore pour les informations sensibles, même avec des informations salées ou est-ce mieux stocké dans la base de données?

82
Lukas

Utilisez la base de données pour les sessions au lieu de la valeur par défaut basée sur les cookies, qui ne doit pas être utilisée pour stocker des informations hautement confidentielles

Créez la table de session avec

rake db:sessions:create

Exécutez la migration

rake db:migrate

Assurez-vous également d'indiquer à Rails d'utiliser ActiveRecord pour gérer également vos sessions.

Rails 3

config/initializers/session_store.rb:

Rails.application.config.session_store :active_record_store

Rails 2

config/environment.rb:

config.action_controller.session_store = :active_record_store
102
Volcanic

Les cookies sont cryptés par défaut dans Rails 4

Dans Rails 4, CookieStore les cookies sont cryptés et signés par défaut:

Si vous n'avez que secret_token set, vos cookies seront signés, mais pas cryptés. Cela signifie qu'un utilisateur ne peut pas modifier son user_id sans connaître la clé secrète de votre application, mais peut facilement lire leur user_id. C'était la valeur par défaut pour Rails 3 applications.

Si tu as secret_key_base set, vos cookies seront cryptés. Cela va plus loin que les cookies signés dans la mesure où les cookies cryptés ne peuvent pas être modifiés ou lus par les utilisateurs. Il s'agit de la valeur par défaut commençant par Rails 4.

Si vous avez les deux secret_token et secret_key_base set, vos cookies seront cryptés et les cookies signés générés par Rails 3 seront lus et cryptés de manière transparente pour fournir un chemin de mise à niveau fluide.

Active Record Session Store est obsolète dans Rails 4

Cette réponse est maintenant obsolète en ce qui concerne Rails 4. Le magasin de sessions d'enregistrement actif a été déconseillé et supprimé de Rails, donc les générateurs suivants ne travail plus long:

  • rake db:sessions:create

  • Rails generate session_migration

Cela a été souligné dans cette réponse . La raison pour laquelle le magasin de sessions d'enregistrement actif a été déconseillé est que les lectures/écritures dans la base de données ne sont pas bien adaptées lorsque vous avez un grand nombre d'utilisateurs accédant à votre application, comme indiqué dans ce billet de blog :

... un problème majeur avec le magasin de sessions Active Record est qu'il n'est pas évolutif. Cela met une charge inutile sur votre base de données. Une fois que votre application reçoit un trafic important, la table de base de données des sessions est continuellement bombardée d'opérations de lecture/écriture.

Depuis Rails 4, le magasin de sessions Active Record a été supprimé du framework principal et est désormais obsolète.

Si vous souhaitez toujours utiliser le magasin de sessions d'enregistrement actif, il est toujours disponible en tant que gemme .

Current Rails Best Practices Session

Pour les meilleures pratiques actuelles pour Ruby on Rails sessions, je vous conseille de consulter les dernières versions des Ruby on Rails Guide de sécurité .

50
user456814

Je ne crois pas que quoi que ce soit ait changé dans la façon dont quiconque sur n'importe quelle plate-forme devrait gérer les sessions basées sur les cookies. Soyez sceptique vis-à-vis de tout ce qui dépasse le contrôle du serveur (cookies, messages de formulaire, etc.). C'est un principe général du développement web.

En ce qui concerne le cryptage, je ne sais pas si quelque chose a changé sur ce front.

Quelque chose à garder à l'esprit avec un magasin de cookies est la limite de la quantité de données, et le piège que ces données seront envoyées sur le fil dans chaque demande, où en tant que magasin de base de données ne transfère que l'identifiant et les données vivent sur le serveur .

9
Tilendor

FWIW, Rails 3.1 suggère d'exécuter

Rails generate session_migration

Cependant, cela génère exactement la même migration que

rake db:sessions:create
4
Nate Milbee

Les valeurs par défaut Rails me semblent assez bonnes - Le CookieStore est rapide et devrait couvrir la majorité des cas d'utilisation. Bien sûr, vous êtes limité à 4 Ko et vos données seront visibles pour l'utilisateur, mais le Rails consiste à n'utiliser la session que pour des choses comme les ID entiers et les valeurs de chaîne de base - Si vous essayez de stocker des objets ou des informations hautement confidentielles dans la session, vous vous trompez probablement.

2
Yarin