Faut-il éviter les variables de session?

36

Dans le passé, j’avais beaucoup misé sur les variables de session, mais j’ai récemment constaté qu’un grand nombre d’entre elles étaient inutiles, utilisant plutôt des paramètres tels que les paramètres de chaîne de requête.

Un de mes collègues refuse d'utiliser les variables de session. Est-ce un objectif réaliste et faut-il éviter les variables de session pour des raisons pratiques? Les variables de session peuvent-elles être évitées complètement (à l'exception des cookies de session pour permettre les connexions) et cela aboutirait-il à de meilleures conceptions?

Voici quelques-unes des raisons pour lesquelles mon collègue ne les a pas utilisées:

  • Nature non typée des variables de session
  • Expiration de session entraînant une perte d'état
  • Portée globale des variables de session
  • Équilibrage de la charge des serveurs perdant des sessions (spécifique .Net?)
  • Redémarrage des pools d'applications / serveurs
  • Ils sont inutiles
Tjaart
la source
3
using things like query string parameters instead- Dans ce cas, utilisez toujours toujours les paramètres de la chaîne de requête, si possible. L'utilisation de session pour ce type de paramètre est fragile et peut introduire des bugs étranges lorsque les utilisateurs ont plusieurs onglets ouverts.
Izkata
2
recommandation personnelle - ne prenez aucun conseil de votre collègue car il ne sait clairement pas de quoi il parle. Délais de session? Ne réalise-t-il pas que la durée des sessions est contrôlée par l'application Web?
GrandmasterB
2
@GrandmasterB Ahem. Soit, ils ne savent pas ce qu'ils font ou ont été brûlés par chacun de ces points critiques au cours de leur carrière (j'en ai moi-même frappé quatre) et connaissent des moyens plus appropriés de traiter un état temporaire.
Ed James
Quelqu'un pourrait-il expliquer la relation entre l'état de la session et l'ouverture de plusieurs onglets? Lorsque vous ouvrez un nouvel onglet, contient-il ou contient-il maintenant l'état de l'onglet précédent? Merci.
Ray

Réponses:

41

Si vous avez une variable de session dans votre application, posez-vous la question suivante:

Lorsque je clique sur le bouton Précédent de mon navigateur, quelle valeur dois-je attribuer à ma variable?

Si la réponse est "la valeur actuelle", les variables de session peuvent être utiles. Un exemple serait un panier: vous ne vous attendez pas à ce que des objets soient retirés du panier lorsque vous remontez dans l'historique. Il est toujours dans son état actuel.

Si la réponse est "une valeur précédente", vous ne devriez pas utiliser de variables de session. Les mauvaises utilisations que j'ai constatées incluent la transmission d'un paramètre entre les pages. Si je clique sur le bouton Précédent pour revenir à une page, celle-ci n'obtient pas nécessairement le paramètre correct. De plus, si j'ouvre deux onglets, comment mon site va-t-il se comporter alors?

Obtenir le bon comportement du bouton de retour n’est en aucun cas une solution simple, mais cela vous aide à penser à un site Web en tant qu’application sans état. En général, je trouve que les utilisations appropriées des variables de session sont rares.

Tim
la source
Je suis d'accord. Une fois que vous avez pensé à la sémantique souhaitée avec plusieurs onglets, il devient généralement évident que les variables de session ou les paramètres de demande constituent le bon choix.
CodesInChaos
J'ai vu exactement ce type d'erreurs avec les variables de session, et j'ai certes appris à la dure.
Tjaart
Lorsqu'un utilisateur appuie sur le bouton de retour, s'attendent-ils à ce que les éléments restent dans le panier jusqu'à la fin de leur session ou souhaitent-ils que les éléments restent jusqu'à leur sortie? L'utilisation d'un autre mécanisme de persistance (comme une base de données) permettrait une persistance au-delà de la session unique et votre bouton Précédent fonctionnerait toujours comme prévu par l'utilisateur.
Lawtonfogle
25

Le protocole HTTP est sans état. Les sessions sont un moyen de préserver l’état du client lors de requêtes HTTP. Vous pouvez choisir de le faire avec la gestion de session intégrée d'une plateforme ou de le faire vous-même avec des paramètres de chaîne de requête. Dans tous les cas, un concept de session est nécessaire pour de nombreuses tâches.

Votre collègue n'aime probablement pas une implémentation spécifique, ou n'a pas utilisé de sessions pour les objectifs prévus. Si vous devez conserver des informations sur une connexion client spécifique via des requêtes HTTP, vous avez besoin d'une forme de persistance de session.

Les problèmes suivants sont spécifiques à l'implémentation:

Nature non typée des variables de session

Portée globale des variables de session

Équilibrage de la charge des serveurs perdant des sessions

Redémarrage des pools d'applications / serveurs

Par exemple, je travaille le plus souvent en PHP et stocke les informations de ma session dans une base de données relationnelle. Donc, mes variables de session sont tapées. L'équilibrage de la charge et les redémarrages du serveur ne posent aucun problème de session.

Celui-ci est plus intéressant:

Expiration de session entraînant une perte d'état

Les sessions sont le plus souvent conservées via des cookies. Ceux-ci peuvent être supprimés par le client à tout moment. Mais ils peuvent également être préservés via un paramètre de chaîne de requête et par conséquent, ne jamais expirer sur le client. Le délai d'attente du serveur est à vous. Donc, même ce problème est spécifique à la mise en œuvre.

Ne rejetons pas tout le concept de sessions simplement parce que nous n'aimons pas une implémentation particulière. Tout bon cadre d’application Web facilitera l’utilisation des sessions afin de préserver les connexions des utilisateurs ou de conserver tout ce qui est spécifique à la visite en cours de l’utilisateur. Les enregistrements de base de données d’un utilisateur peuvent (et devraient) être utilisés pour stocker des éléments qui lui sont spécifiques lorsqu’ils sont connectés. Cependant, les visiteurs anonymes peuvent avoir des informations temporaires à conserver dans leur session, telles que la liste succincte des pages visitées récemment ou la préférence donnée à. cacher un avis qu'ils ont déjà vu. Généralement, seules des informations temporaires plus petites sont appropriées pour le stockage de session.

Matt S
la source
Pour être honnête, j’ai eu une expérience limitée des frameworks en plus de .Net. .Net ne s'arrête pas avant d'imposer une valeur de délai d'expiration pour vos sessions. Les variables de session apparaissent également dans le code côté serveur sous la forme d'un dictionnaire non typé. De toute façon, j’enveloppe habituellement ce dictionnaire dans des classes correctement typées, donc je ne vois pas cela comme un problème non plus. Vous avez mentionné que vous stockiez les informations de votre session dans la base de données. Dans ASP .Net, le stockage est traité autrement, soit dans le client .Net, dans la base de données (gérée automatiquement) ou dans un service Windows séparé.
Tjaart
Pouvez-vous donner quelques exemples d'objectifs pour les sessions?
Tjaart
@Tjaart: J'ai développé un peu le dernier paragraphe. J'espère que ça t'as aidé.
Matt S
14

D'autres ont soulevé beaucoup de points positifs (que je ne vais pas répéter), mais il y a un aspect de la technique de votre ami qui n'a pas encore été abordé: la sécurité .

Il est impossible de savoir quel genre de vulnérabilités vous ouvrez sans regarder le code, mais voici quelques petites choses auxquelles je peux penser spontanément.

  • Fixation de session : Une attaque puissante qui est légèrement plus facile si vous pouvez simplement demander à l'utilisateur de cliquer sur un lien qui contient déjà les informations nécessaires dans l'URL (plutôt que d'essayer d'inciter l'utilisateur à utiliser une machine dont les cookies sont correctement configurés).
  • Injection SQL (ou autre entrée malveillante) : ne faites jamais confiance à quoi que ce soit qui vient de l'utilisateur. Les variables de session ont l'avantage de ne jamais quitter le serveur. Par conséquent, l'utilisateur ne peut pas les modifier directement. Bien que vous deviez effacer les données avant de les insérer dans la session, vous pouvez toujours faire confiance aux valeurs que vous transmettez par la suite. Si tout est passé à travers la chaîne de requête, vous avez BEAUCOUP de validation à faire pour vous assurer que vous n'acceptez pas une entrée malveillante.
  • Corruption de données à l'aide d'entrées falsifiées : Semblable à l'injection SQL, combien de données échangez-vous? Est-ce crucial? Puis-je changer le comportement de votre application en modifiant une valeur dans la chaîne de requête? Puis-je corrompre les données sur votre serveur en modifiant des valeurs? Si je parviens à corrompre les données sur le serveur, cela affectera-t-il les autres utilisateurs? (Si votre réponse était "non", ma réponse est "êtes-vous sûr? Vous avez de nombreux endroits à vérifier".)

Tout cela peut quand même arriver quand vous utilisez Sessions, mais cela peut devenir beaucoup plus facile si votre ami ne sait pas ce qu'il fait.

Riwalk
la source
2

Les variables de session ressemblent, dans une certaine mesure, aux anciennes variables globales de base. Il incombe à l'utilisateur de les garder en mémoire, de savoir ce qu'ils contiennent, leur portée et leur utilisation. comme dans les anciennes versions de BASIC. Cela étant dit, pourquoi quelqu'un écarterait-il totalement l'utilisation d'un mécanisme qui est évidemment conçu pour faire partie intégrante et très importante du modèle de programmation (ASP, MVC, etc.)?

Le seul inconvénient que j'ai rencontré en utilisant les variables de session, c'est que cela vous impose de garder la trace de celles-ci, de vous assurer qu'elles sont remplies avec des données pertinentes et de les éliminer.

N'est-ce pas ce que nous faisons lorsque nous programmons de quelque manière que ce soit?

Mac
la source
1

J'avais l'habitude de penser comme votre collègue à cause de mauvaises expériences. J'avais eu des problèmes de débogage liés aux variables de session, qui n'étaient en réalité qu'une incompétence de ma part. Oui, vous pouvez vous débrouiller dans une certaine mesure sans variables de session, en utilisant des chaînes de requête, des champs cachés dans des formulaires, etc. Cependant, il devient très rapidement fastidieux de le faire de cette façon si votre application a quelque chose de plus à déterminer le processus logique le plus élémentaire. Il existe également le risque de sécurité de montrer le fonctionnement interne de votre application via des chaînes de requête et des champs cachés, qui peuvent servir de vecteurs d’attaque.

Lorsque vous travaillez avec des variables de session, vous devez simplement savoir quand elles sont configurées et non définies, car cela déterminera le flux logique de l'application. C'est comme la gestion de la mémoire dans un langage comme le C.

Notez que cela vient de mon expérience avec PHP sur un projet relativement petit, sans framework, les choses peuvent être différentes sur d'autres plateformes, mais je pense que le principe général s'applique toujours.

primehunter326
la source
2
Comment obtenir la sémantique de plusieurs tabulations correctement lors de l'utilisation de sessions pour des états impliqués dans votre flux de contrôle? Les sessions fonctionnent bien pour la connexion et les paramètres tels que les propriétés, mais elles ne possèdent pas la bonne sémantique pour la plupart des autres utilisations.
CodesInChaos
Je ne suis pas sûr que ce que j'ai posté était basé sur ma propre expérience certes limitée de la construction d'une application Web basée sur une base de données en PHP / MySQL. Comment les multiples onglets dans les navigateurs sont-ils généralement gérés (je suppose que c'est de cela que vous parlez)?
primehunter326
@ primehunter326 Avec des paramètres de route, des chaînes de requête ou des champs de formulaire masqués.
Casey
0

Comme indiqué précédemment, HTTP est sans état et la variable de session casse cela. La conception HTTP pour être sans état facilite la mise en cache des ressources. Pour les ressources disponibles au public.

Il est possible de concevoir un site Web sans variable de session, mais c'est plus difficile. Le plus difficile (IMHO) est la connexion / déconnexion sophistiquée, les schémas d'authentification HTTP ne fournissent pas les outils nécessaires pour s'authentifier via un formulaire HTML (vous pouvez pirater quelque chose avec javascript - XHR à https: // untel: [email protected] ) et il est encore plus difficile de vous déconnecter et d'être compatible avec tous les navigateurs. Il y a eu des discussions sur les listes de distribution du W3 à ce sujet, mais si je me souviens bien, l'idée a été abandonnée.

Pour le reste, vous devriez pouvoir vivre sans variables de session. Vous aurez un état sur une base de données, des fichiers ou n’importe où, mais l’utilisation des variables de session devrait être rare.

Si votre utilisateur a un panier d'achat, il s'agit d'une session variable uniquement s'il est supposé pouvoir naviguer sur deux ordinateurs / navigateur sans partager le panier.

Mathieu
la source