PHP: $ _SESSION - Quels sont les avantages et les inconvénients du stockage des données temporairement utilisées dans la variable $ _SESSION

StackOverflow https://stackoverflow.com/questions/77826

  •  09-06-2019
  •  | 
  •  

Question

Une chose que j'ai commencé à faire plus souvent récemment est la récupération de données au début d'une tâche et leur stockage dans une $ _SESSION ['myDataForTheTask'] .

Maintenant, cela me semble très pratique, mais je ne connais rien des performances, des risques de sécurité ou autres, utilisant cette approche. Est-ce quelque chose qui est fait régulièrement par des programmeurs plus expérimentés ou est-ce plus une chose d'amateur à faire?

Par exemple:

if (!isset(

Une chose que j'ai commencé à faire plus souvent récemment est la récupération de données au début d'une tâche et leur stockage dans une $ _SESSION ['myDataForTheTask'] .

Maintenant, cela me semble très pratique, mais je ne connais rien des performances, des risques de sécurité ou autres, utilisant cette approche. Est-ce quelque chose qui est fait régulièrement par des programmeurs plus expérimentés ou est-ce plus une chose d'amateur à faire?

Par exemple:

<*>SESSION['dataentry'])) { $query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=" . mysql_real_escape_string(

Une chose que j'ai commencé à faire plus souvent récemment est la récupération de données au début d'une tâche et leur stockage dans une $ _SESSION ['myDataForTheTask'] .

Maintenant, cela me semble très pratique, mais je ne connais rien des performances, des risques de sécurité ou autres, utilisant cette approche. Est-ce quelque chose qui est fait régulièrement par des programmeurs plus expérimentés ou est-ce plus une chose d'amateur à faire?

Par exemple:

<*>GET['wave_id']); $result_taskinfo = $db->query($query_taskinfo); $row_taskinfo = $result_taskinfo->fetch_row(); $dataentry = array("pcode" => $row_taskinfo[0], "modules" => $row_taskinfo[1], "data_id" => 0, "wavenum" => $row_taskinfo[2], "prequest" => FALSE, "highlight" => array());

Une chose que j'ai commencé à faire plus souvent récemment est la récupération de données au début d'une tâche et leur stockage dans une $ _SESSION ['myDataForTheTask'] .

Maintenant, cela me semble très pratique, mais je ne connais rien des performances, des risques de sécurité ou autres, utilisant cette approche. Est-ce quelque chose qui est fait régulièrement par des programmeurs plus expérimentés ou est-ce plus une chose d'amateur à faire?

Par exemple:

<*>SESSION['dataentry'] = $dataentry; }
Était-ce utile?

La solution

Eh bien, les variables de session sont vraiment l’un des seuls moyens (et probablement le plus efficace) d’avoir ces variables disponibles tout le temps que le visiteur est sur le site Web. Il n’existe aucun moyen réel pour un utilisateur de les modifier exploiter dans votre code, ou dans l'interpréteur PHP) afin qu'ils soient assez sécurisés.

C’est un bon moyen de stocker les paramètres qui peuvent être modifiés par l’utilisateur, car vous pouvez lire les paramètres de la base de données une fois au début d’une session et qu’ils sont disponibles pour toute la session, il vous suffit de passer d’autres appels à la base de données. Si les paramètres sont modifiés et bien sûr, comme vous l'indiquez dans votre code, il est simple de savoir s'ils existent déjà ou s'ils doivent être extraits de la base de données.

Je ne vois pas d'autre moyen de stocker les variables temporaires en toute sécurité (car les cookies peuvent facilement être modifiés et que cela ne sera pas souhaitable dans la plupart des cas). Ainsi, $ _SESSION serait le moyen d'aller & nbsp; suffisant

.

Autres conseils

Le mécanisme $ _SESSION utilise des cookies.

Dans le cas de Firefox (et peut-être d'un nouvel IE, je ne me suis pas vérifié), cela signifie que la session est partagée entre des onglets ouverts . Ce n'est pas quelque chose que vous attendez par défaut. Et cela signifie que la session n'est plus "quelque chose de spécifique à une seule fenêtre / utilisateur".

Par exemple, si vous avez ouvert deux onglets pour accéder à votre site et que vous avez ouvert une session en tant que root à l'aide du premier onglet, vous obtiendrez les privilèges root de l'autre.

C'est vraiment peu pratique, surtout si vous codez un client de messagerie électronique ou autre chose (comme une boutique en ligne). Dans ce cas, vous devrez gérer les sessions manuellement, introduire une clé constamment régénérée dans l'URL ou faire autre chose.

J'utilise la variable de session tout le temps pour stocker des informations pour les utilisateurs. Je n'ai vu aucun problème de performance. Les données de session sont extraites du cookie (ou PHPSESSID si les cookies sont désactivés). Je ne vois pas cela comme un risque de sécurité plus important que toute autre authentification basée sur un cookie, et probablement plus sûr que le stockage des données réelles dans le cookie des utilisateurs.

Juste pour vous faire savoir que votre déclaration SQL pose un problème de sécurité:

SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".

J'utilise la variable de session tout le temps pour stocker des informations pour les utilisateurs. Je n'ai vu aucun problème de performance. Les données de session sont extraites du cookie (ou PHPSESSID si les cookies sont désactivés). Je ne vois pas cela comme un risque de sécurité plus important que toute autre authentification basée sur un cookie, et probablement plus sûr que le stockage des données réelles dans le cookie des utilisateurs.

Juste pour vous faire savoir que votre déclaration SQL pose un problème de sécurité:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id='".mysql_real_escape_string(

J'utilise la variable de session tout le temps pour stocker des informations pour les utilisateurs. Je n'ai vu aucun problème de performance. Les données de session sont extraites du cookie (ou PHPSESSID si les cookies sont désactivés). Je ne vois pas cela comme un risque de sécurité plus important que toute autre authentification basée sur un cookie, et probablement plus sûr que le stockage des données réelles dans le cookie des utilisateurs.

Juste pour vous faire savoir que votre déclaration SQL pose un problème de sécurité:

SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".

J'utilise la variable de session tout le temps pour stocker des informations pour les utilisateurs. Je n'ai vu aucun problème de performance. Les données de session sont extraites du cookie (ou PHPSESSID si les cookies sont désactivés). Je ne vois pas cela comme un risque de sécurité plus important que toute autre authentification basée sur un cookie, et probablement plus sûr que le stockage des données réelles dans le cookie des utilisateurs.

Juste pour vous faire savoir que votre déclaration SQL pose un problème de sécurité:

<*>

Vous devez JAMAIS, JE RÉPÉTE JAMAIS , prendre les données fournies par l'utilisateur et les utiliser pour exécuter une instruction SQL sans la nettoyer au préalable. Je la placerais entre guillemets et ajouterais la fonction mysql_real_escape_string () . Cela vous protégera de la plupart des attaques. Donc, votre ligne ressemblerait à:

<*>GET['wave_id'];

Vous devez JAMAIS, JE RÉPÉTE JAMAIS , prendre les données fournies par l'utilisateur et les utiliser pour exécuter une instruction SQL sans la nettoyer au préalable. Je la placerais entre guillemets et ajouterais la fonction mysql_real_escape_string () . Cela vous protégera de la plupart des attaques. Donc, votre ligne ressemblerait à:

<*>GET['wave_id'])."'";

Vous devez JAMAIS, JE RÉPÉTE JAMAIS , prendre les données fournies par l'utilisateur et les utiliser pour exécuter une instruction SQL sans la nettoyer au préalable. Je la placerais entre guillemets et ajouterais la fonction mysql_real_escape_string () . Cela vous protégera de la plupart des attaques. Donc, votre ligne ressemblerait à:

<*>GET['wave_id'];

Vous devez JAMAIS, JE RÉPÉTE JAMAIS , prendre les données fournies par l'utilisateur et les utiliser pour exécuter une instruction SQL sans la nettoyer au préalable. Je la placerais entre guillemets et ajouterais la fonction mysql_real_escape_string () . Cela vous protégera de la plupart des attaques. Donc, votre ligne ressemblerait à:

<*>

Vous devrez prendre en compte quelques facteurs pour décider du lieu de stockage des données temporaires. Le stockage de session est idéal pour les données spécifiques à un seul utilisateur. Si vous trouvez que le gestionnaire de stockage de session par défaut basé sur fichier est inefficace, vous pouvez implémenter autre chose, en utilisant éventuellement un type de base de données ou memcache. Voir session_set_save_handler pour plus d'informations.

Je trouve qu'il est déconseillé de stocker des données communes dans la session d'un utilisateur. Il existe de meilleurs emplacements pour stocker des données qui seront fréquemment consultées par plusieurs utilisateurs. En les stockant dans la session, vous dupliquez les données pour chaque utilisateur ayant besoin de ces données. Dans votre exemple, vous pouvez configurer un type de moteur de stockage différent pour ces données wave (basé sur wave_id) qui n'est PAS spécifiquement lié à la session d'un utilisateur. De cette façon, vous extrayez les données une fois et les stockez quelque part où plusieurs utilisateurs peuvent accéder aux données sans nécessiter une autre extraction.

Si vous utilisez votre propre serveur ou dans un environnement où personne ne peut surveiller vos fichiers / mémoire sur le serveur, les données de session sont sécurisées. Ils sont stockés sur le serveur et juste un cookie d'identification envoyé au client. Le problème est de savoir si d'autres personnes peuvent attraper le cookie et se faire passer pour quelqu'un d'autre, bien sûr. En utilisant HTTPS et en veillant à ne pas mettre l'ID de session dans les URL, vos utilisateurs devraient être à l'abri de la plupart de ces problèmes. (XSS peut toujours être utilisé pour extraire les cookies si vous ne faites pas attention, voir Jeef Atwoods post sur cette aussi.)

En ce qui concerne les éléments à stocker dans une variable de session, mettez-y vos données si vous souhaitez les référencer à nouveau sur une autre page, comme un panier, mais ne les mettez pas ici s'il ne s'agit que de données temporaires utilisées pour la résultat de cette page, comme une liste de balises pour le post actuellement affiché. Les sessions sont destinées aux données persistantes par utilisateur.

Un autre moyen d'améliorer la validation des entrées consiste à convertir la variable _GET ["wave_id"]:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".(int)

Un autre moyen d'améliorer la validation des entrées consiste à convertir la variable _GET ["wave_id"]:

<*>

Je suppose que wave_id est un entier et qu'il n'y a qu'une seule réponse.

Est-ce que

GET['wave_id']." LIMIT 1";

Je suppose que wave_id est un entier et qu'il n'y a qu'une seule réponse.

Est-ce que

Quelques autres inconvénients liés à l'utilisation de sessions:

    Les données
  1. $ _SESSION expireront après session.gc_maxlifetime secondes d'inactivité.
  2. N'oubliez pas d'appeler session_start () pour chaque script qui utilisera les données de session.
  3. La mise à l'échelle du site Web en répartissant la charge sur plusieurs serveurs peut poser problème, car l'utilisateur doit être redirigé vers le même serveur à chaque fois. Résolvez ce problème avec "Sticky Sessions".
Les éléments

$ _SESSION sont stockés dans la session, qui est, par défaut, conservée sur le disque. Il n'est pas nécessaire de créer votre propre tableau et de le ranger dans une entrée de tableau 'dataentry' comme vous l'avez fait. Vous pouvez simplement utiliser $ _SESSION ['pcode'], $ _SESSION ['modules'] et ainsi de suite.

Comme je l'ai dit, la session est stockée sur le disque et un pointeur sur la session est stocké dans un cookie. L’utilisateur ne peut donc pas accéder facilement aux données de la session.

IMO, il est parfaitement acceptable de stocker des éléments dans la session. C'est un excellent moyen de rendre les données persistantes. C'est aussi, dans de nombreux cas, plus sûr que de tout stocker dans des cookies. Voici quelques préoccupations:

  • Il est possible que quelqu'un détourne une session. Par conséquent, si vous comptez l'utiliser pour suivre les autorisations des utilisateurs, soyez prudent. Lisez this pour plus d'informations.
  • Cela peut être un moyen très paresseux de conserver des données. Ne vous contentez pas de tout jeter dans la session pour ne pas avoir à le demander plus tard.
  • Si vous envisagez de stocker des objets dans la session, vous devez inclure leurs fichiers de classe avant le démarrage de la session sur la requête suivante ou configurer un chargeur automatique.

Zend Framework a une bibliothèque utile pour la gestion des données de session qui aide à l'expiration et à la sécurité (pour des choses comme les captchas). Ils ont également une explication utile des sessions. Voir http://framework.zend.com/manual/fr/zend.session .html

J'ai trouvé les sessions très utiles, mais quelques points à noter:

1) PHP peut stocker vos sessions dans un dossier tmp ou un autre répertoire accessible aux autres utilisateurs de votre serveur. Vous pouvez changer le répertoire dans lequel les sessions sont stockées en allant dans le fichier php.ini.

2) Si vous configurez un système de grande valeur nécessitant une sécurité très stricte, vous pouvez chiffrer les données avant de les envoyer à la session et les déchiffrer pour les utiliser. Remarque: cela peut entraîner une surcharge excessive en fonction de votre trafic / capacité du serveur.

3) J'ai trouvé que session_destroy (); ne supprime pas la session immédiatement, vous devez toujours attendre que le ramasse-miettes PHP nettoie les sessions. Vous pouvez changer la fréquence d'exécution du garbage collector dans le fichier php.ini. Mais cela ne semble toujours pas très fiable, plus d'infos http: // www. captain.at/howto-php-sessions.php

Vous voudrez peut-être savoir à quel point c'est REST-ful?

i.e. voir " Communiquer de manière apathique " paragraphe de " Une brève introduction à REST " ...

  

" Les mandats REST qui stipulent être soit   transformé en ressources, ou gardé sur   le client. En d'autres termes, un serveur   ne devrait pas avoir à conserver une sorte de   état de communication pour l'un des   les clients, il communique avec au-delà d'un   requête unique. "

(ou l'un des autres liens sur wikipedia pour REST )

Donc, dans votre cas, le 'wave_id' est une ressource utile pour GET, mais voulez-vous vraiment le stocker dans la SESSION? Certes, memcached est votre solution pour mettre en cache l'objet Resource?

J'utilise un peu cette approche, je n'y vois aucun problème. Contrairement aux cookies, les données ne sont pas stockées côté client, ce qui est souvent une grave erreur.

Comme pour tout, cependant, veillez à toujours supprimer les entrées de l'utilisateur, en particulier si vous les insérez dans la variable $ _SESSION, puis que vous les utiliserez plus tard dans une requête SQL.

C’est une chose assez courante à faire et la session sera généralement plus rapide que les accès continus à la base de données. Ils sont également assez sûrs, car les développeurs PHP ont travaillé dur pour empêcher le détournement de session.

Le seul problème est que vous devez vous rappeler de reconstruire l'entrée de session lorsque quelque chose change. Et, si quelque chose est modifié par un utilisateur autre que celui qui est propriétaire de la session et qui nécessiterait d'actualiser cette clé, il n'existe pas de moyen facile de notifier au système cette actualisation de la clé de session. Peut-être pas un gros problème, mais quelque chose que vous devriez être au courant.

$ _SESSION est très utile pour la sécurité, car il s'agit d'un moyen côté serveur de stocker des informations lorsqu'un utilisateur est activement sur vos pages. Il est donc difficile à pirater à moins que votre fichier ou votre serveur php ait des faiblesses exploitées. Une très bonne implémentation stocke une variable pour confirmer que l'utilisateur est connecté et n'autorise les actions que si sa connexion est confirmée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top