Les requêtes AJAX conservent-elles les informations de session PHP?

154

Si j'avais un utilisateur connecté sur mon site, ayant son identifiant stocké $_SESSION, et depuis son navigateur, il cliquait sur un bouton «Enregistrer» qui ferait une demande AJAX au serveur. Les $_SESSIONcookies et lui seront-ils conservés dans cette demande et puis-je compter en toute sécurité sur la présence de l'identifiant dans le $_SESSION?

Cliquez sur Upvote
la source

Réponses:

191

La réponse est oui:

Les sessions sont gérées côté serveur. En ce qui concerne le serveur, il n'y a aucune différence entre une requête AJAX et une requête de page normale. Ce sont tous les deux des requêtes HTTP et ils contiennent tous les deux des informations sur les cookies dans l'en-tête de la même manière.

Du côté client, les mêmes cookies seront toujours envoyés au serveur qu'il s'agisse d'une requête régulière ou d'une requête AJAX. Le code Javascript n'a pas besoin de faire quoi que ce soit de spécial ou même d'être conscient de ce qui se passe, il fonctionne simplement de la même manière que pour les requêtes régulières.

thomasrutter
la source
10
Suivi: le serveur peut définir un HttpOnlyindicateur lors de la configuration d'un cookie, ce qui signifie que votre Javascript ne pourra pas voir le cookie. Cependant, le cookie sera toujours envoyé pour les demandes de page AJAX et régulières et continuera à fonctionner exactement de la même manière. Votre Javascript ne le verra tout simplement pas document.cookie.
thomasrutter
Si le rapport d'erreur PHP est activé, vous pouvez obtenir une erreur de session renvoyée avec la réponse AJAX. J'ai Warning: session_write_close(): Failed to write session data (user)récemment reçu une erreur par intermittence dans un projet, mais uniquement lorsque la requête AJAX se produit pendant le chargement du reste de la page. J'utilise une base de données MySQL pour les données de session, et il est possible que la requête de la page principale verrouille cette table, empêchant la requête AJAX d'y accéder.
Buttle Butkus
@ButtleButkus cela ressemble à un problème dans votre code côté serveur et je suis sûr que les gens seront prêts à vous aider si vous soumettez cela comme sa propre question. Vous ne devriez pas avoir cette erreur simplement parce que vous utilisez MySQL pour les sessions car il ne devrait pas se verrouiller d'une manière qui échouerait avec une erreur. Cela peut être un problème avec les connexions MySQL saturées, ou un autre problème sans rapport.
thomasrutter
Cela se passe sur une machine vagabonde, donc les connexions MySQL devraient être saturées. Je publierai certainement une question si je ne peux pas la comprendre bientôt.
Buttle Butkus
23

Si le fichier PHP des requêtes AJAX a un, session_start()les informations de session seront conservées. (à l'exception des demandes sont dans le même domaine)

Ólafur Waage
la source
2
en effet, c'est ce que j'ai oublié de faire :-)
sivann
23

Ce à quoi vous voulez vraiment en venir est: les cookies sont-ils envoyés avec la requête AJAX? En supposant que la requête AJAX concerne le même domaine (ou dans les limites de domaine du cookie), la réponse est oui. Ainsi, les requêtes AJAX vers le même serveur conservent les mêmes informations de session (en supposant que les scripts appelés émettent un session_start () comme pour tout autre script PHP souhaitant accéder aux informations de session).

cletus
la source
1
Je me trompe peut-être, mais je pensais qu'il n'était même pas possible de publier des requêtes ajax sur d'autres domaines (sous-domaines exclus)?
Emil H
Vous pourrez peut-être tricher avec l'astuce de script dynamique. Jamais fatigué cependant.
cletus
1
Oui, les requêtes ajax ne peuvent pas être effectuées vers d'autres domaines. Cependant, vous pouvez insérer dynamiquement une balise <script> dans la page et définir son src sur une URL hors domaine qui fait écho au javascript.
Cliquez sur Upvote
1
Les requêtes ajax ne peuvent pas être effectuées vers d'autres domaines. mais vous pouvez créer un proxy dans votre code php. ajax demande au proxy, la demande proxy à un autre domaine.
Peter Long
2
Juste une note ... les requêtes ajax peuvent être effectuées entre domaines, mais uniquement si le type de réponse est jsonp. Je le fais tout le temps.
Epiphany
8

Enfin, pas toujours. En utilisant des cookies, vous êtes bon. Mais le "puis-je compter en toute sécurité sur la présence de l'identifiant" m'a incité à prolonger la discussion avec un point important (surtout à titre de référence, car le nombre de visiteurs de cette page semble assez élevé).

PHP peut être configuré pour maintenir les sessions par réécriture d'URL, au lieu de cookies. ( Comment c'est bon ou mauvais (<- voir par exemple le commentaire le plus haut ici) est une question distincte , tenons-nous maintenant à la question actuelle, avec une seule note latérale: le problème le plus important avec les sessions basées sur l'URL - le flagrant visibilité de l'ID de session nu - ce n'est pas un problème avec les appels Ajax internes; mais ensuite, s'il est activé pour Ajax, il est également activé pour le reste du site, donc là ...)

En cas de sessions de réécriture d'URL (sans cookie), les appels Ajax doivent s'en occuper eux-mêmes - que leurs URL de requête soient correctement conçues. (Ou vous pouvez déployer votre propre solution personnalisée. Vous pouvez même recourir au maintien des sessions côté client , dans des cas moins exigeants.) Le point est le soin explicite nécessaire à la continuité de session, si vous n'utilisez pas de cookies:

  1. Si les appels Ajax extraient simplement les URL textuellement du HTML (tel que reçu de PHP), cela devrait être OK, car elles sont déjà cuites (umm, cookifiées).

  2. S'ils ont besoin d' assembler eux-mêmes les URI de demande, l'ID de session doit être ajouté manuellement à l'URL. (Vérifiez ici , ou les sources de page générées par PHP ( avec la réécriture d'URL activée ) pour voir comment le faire.)


De OWASP.org :

En effet, l'application web peut utiliser les deux mécanismes, cookies ou paramètres d'URL, voire basculer de l'un à l'autre (réécriture d'URL automatique) si certaines conditions sont remplies (par exemple, l'existence de clients web sans support de cookies ou lorsque les cookies ne sont pas accepté en raison de problèmes de confidentialité de l'utilisateur).

De message du forum Ruby :

Lors de l'utilisation de php avec des cookies, l'ID de session sera automatiquement envoyé dans les en-têtes de requête, même pour Ajax XMLHttpRequests. Si vous utilisez ou autorisez des sessions php basées sur des URL, vous devrez ajouter l'ID de session à chaque URL de requête Ajax.

Sz.
la source
Des statistiques fiables sur le nombre de personnes dont les cookies de session sont désactivés? (Je n'ai pas réussi à en trouver. Seulement sur Javascript: cela semble autour de 2% aux États-Unis / Europe et ~ 1,2% en moyenne mondiale)
Sz.
Les identifiants de session sur l'URL sont une pratique obsolète et non sécurisée . Sur le Web d'aujourd'hui, personne ne devrait supposer qu'il peut surfer avec les cookies désactivés et toujours se connecter aux sites Web sur lesquels il détient un compte. Si l'un de vos visiteurs a désactivé les cookies, il est probablement prudent de supposer que soit a) ils ne souhaitent spécifiquement pas pouvoir se connecter sur un site pour des raisons de confidentialité; ou b) ils l'ont fait accidentellement, et maintenant ils ne peuvent se connecter à aucun site, pas seulement au vôtre.
thomasrutter
3

Il est très important que les requêtes AJAX conservent la session. L'exemple le plus simple est lorsque vous essayez de faire une requête AJAX pour le panneau d'administration, disons. Bien sûr, vous protégerez la page à laquelle vous faites la demande, pour qu'elle ne soit pas accessible par d'autres personnes qui n'ont pas la session que vous obtenez après la connexion de l'administrateur. Logique?

Bogdan Constantinescu
la source
0

Une chose à surveiller cependant, en particulier si vous utilisez un framework, est de vérifier si l'application régénère les identifiants de session entre les demandes - tout ce qui dépend explicitement de l'identifiant de session rencontrera des problèmes, bien que le reste des données dans la session ne sera pas affectée.

Si l'application régénère des identifiants de session comme celui-ci, vous pouvez vous retrouver avec une situation dans laquelle une demande ajax invalide / remplace en fait l'identifiant de session dans la page de demande.

John
la source
0

C'est ce que font les frameworks, par exemple si vous initialisez la session dans Front Controller ou dans un script boostrap, vous n'aurez pas à vous soucier de son initialisation, ni pour les contrôleurs de page ni pour les contrôleurs ajax. Les frameworks PHP ne sont pas une panacée, mais ils font tellement de choses utiles comme ça!

AlexA
la source
0

mettez votre session () auth dans toutes les pages côté serveur acceptant une requête ajax:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

c'est à peu près la seule façon dont je l'ai fait.

brianabee7
la source