web-dev-qa-db-fra.com

Pourquoi est-il bon d'enregistrer des sessions dans la base de données?

J'ai vu que codeigniter a la possibilité de sauvegarder les valeurs de session dans la base de données.
Il est indiqué que l'enregistrement de la session dans la base de données est une bonne pratique de sécurité.

Mais je pense que l'enregistrement des informations de session dans la base de données permet d'améliorer les performances.
Ils ne sauvegardent que quelques éléments de la session, tels que:

CREATE TABLE IF NOT EXISTS  'ci_sessions' (
  session_id varchar(40) DEFAULT '0' NOT NULL,
  ip_address varchar(16) DEFAULT '0' NOT NULL,
  user_agent varchar(50) NOT NULL,
  last_activity int(10) unsigned DEFAULT 0 NOT NULL,
  user_data text NOT NULL,
  PRIMARY KEY (session_id)
);

Mais si un site utilise plus de variables de session telles que le nom d'utilisateur, la dernière heure de connexion, etc., je peux les enregistrer dans la base de données et les utiliser dans le programme.

Dois-je ajouter ces colonnes à la même table? Je pense que l'enregistrement des informations de session dans la base de données ne fait que réduire l'utilisation de la mémoire (RAM) des serveurs Web. Quelqu'un peut-il expliquer en quoi cela améliore la sécurité?.

44
kiriappa

Cela n'améliore en rien la sécurité.

Le modèle le plus courant et le plus raisonnable pour stocker des sessions dans la base de données est lorsque vous avez plusieurs serveurs frontaux, vous avez donc besoin d'un stockage de session partagé pour eux.

Pour les downvoters: un fichier dans le système de fichiers n'est pas moins sécurisé qu'un enregistrement dans la base de données.

88
zerkms

L'idée est que les sessions ne peuvent pas être détournées.

Un identifiant de session est stocké dans un cookie. Si un pirate peut voler cette pièce d'identité, il peut prétendre être quelqu'un d'autre, car une session est identifiée par ... c'est une pièce d'identité.

En enregistrant l'ID de session d'un utilisateur, l'IP et l'agent côté serveur (votre base de données par exemple), vous pouvez comparer les données enregistrées dans la base de données avec le client. Si un pirate vole l'ID de session de quelqu'un, le pirate pourrait ne pas avoir d'adresse IP et/ou d'agent utilisateur correspondant, ce qui rend les utilisateurs non identiques, ce qui vous permet d'afficher ou de masquer certains contenus.

Vous devez cependant comparer les données manuellement.

17
Tim S.

Un faux pas de sécurité courant avec les sessions basées sur des fichiers consiste à les stocker dans /tmp ou un autre répertoire partagé où les données peuvent être accessibles à des tiers; en particulier sur les hôtes partagés, cela peut être un problème. Cela peut être évité avec des autorisations de fichier appropriées.

Les stocker dans une base de données signifie que vous avez toutes les restrictions d'accès de la base de données en place, mais cela signifie également que vous devez les configurer correctement et configurer le stockage physique de la base de données en toute sécurité.

Il améliore les performances dans la mesure où le serveur de base de données a plus de couches pour améliorer les performances grâce à la mise en cache et au stockage en mémoire, tandis que les sessions basées sur des fichiers entraînent toujours un accès au disque. L'accès simultané peut être amélioré car vous pouvez choisir d'autres mécanismes de concurrence que le verrouillage de fichiers. Si votre serveur de base de données est déjà occupé par un travail de base de données régulier, lancer la gestion de session peut également être une bonne idée.

9
deceze

Voici la réponse: puis-je les enregistrer dans la base de données et les utiliser dans le programme?

Oui, vous pouvez les enregistrer dans la base de données, mais il n'est pas nécessaire de créer une colonne distincte pour cela. Il va dans la colonne userdata.

Vous pouvez définir le nom d'utilisateur avec $this->session->set_userdata('sessionname',session value);

Vous pouvez le récupérer avec $var=$this->session->userdata('sessionname');

4
Ganesh RJ

Vous ne mentionnez pas si vous utilisez PHP ou MYSQL, mais enregistrer votre session dans une base de données ne vous donne pas de meilleures performances, en fait bien au contraire.

La session basée sur un fichier par défaut dans PHP est beaucoup plus rapide que la récupération des valeurs de session dans la base de données, mais vous ne remarquerez pas vraiment la différence avant de traiter des milliers de requêtes par seconde.

3
Vincent
  • L'application doit pouvoir s'exécuter sur plusieurs serveurs sans affinité de serveur (méthodes qui dirigent les demandes du même client vers le même serveur). Un moyen simple de s'assurer que les sessions continuent de fonctionner correctement consiste à stocker les sessions dans une base de données centrale commune à tous les serveurs.

  • L'application doit pouvoir s'exécuter sur un hôte partagé, où il existe des problèmes de sécurité importants associés au stockage des données de session dans le système de fichiers.

  • Les besoins de performances de l'application sont très exigeants et nécessitent une solution de stockage plus sophistiquée pour les données de session. Il existe de nombreuses idées et méthodologies existantes qui traitent des problèmes de performances des bases de données, et celles-ci peuvent être utilisées lorsque les sessions sont stockées dans une base de données.

2
Nikunj K.