160 votes

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

Si un utilisateur est connecté à mon site et que son identifiant est stocké dans le fichier $_SESSION Depuis son navigateur, il a cliqué sur le bouton "Enregistrer", ce qui a entraîné une demande AJAX au serveur. Est-ce que son $_SESSION et les cookies seront conservés dans cette requête, et puis-je compter sans risque sur le fait que l'identifiant est présent dans le fichier $_SESSION ?

196voto

thomasrutter Points 42905

La réponse est oui :

Les sessions sont maintenues 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 ordinaire. Ce sont toutes deux des demandes HTTP, et elles contiennent toutes deux des informations de cookie 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 ordinaire 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 de la même manière que pour les demandes normales.

10 votes

Suivi : le serveur peut définir un HttpOnly lors de la création d'un cookie, ce qui signifie que votre Javascript ne sera pas en mesure de voir le cookie. Cependant, le cookie sera sera toujours envoyé pour les requêtes AJAX et les requêtes de pages normales et continuera à fonctionner exactement de la même manière. Votre Javascript ne le verra simplement pas dans document.cookie .

0 votes

Si le rapport d'erreur PHP est activé, vous pouvez obtenir une erreur de session renvoyée avec la réponse AJAX. J'ai obtenu par intermittence un Warning: session_write_close(): Failed to write session data (user) récemment dans un projet, mais seulement 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.

0 votes

@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 cette question en tant que telle. Vous ne devriez pas obtenir cette erreur simplement parce que vous utilisez MySQL pour les sessions, car il ne devrait pas se verrouiller d'une manière qui entraînerait une erreur. Il peut s'agir d'un problème de saturation des connexions MySQL ou d'un autre problème sans rapport.

23voto

cletus Points 276888

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

1 votes

Je me trompe peut-être, mais je pensais qu'il n'était même pas possible de poster des requêtes ajax vers d'autres domaines (à l'exception des sous-domaines) ?

0 votes

Vous pouvez peut-être tricher avec l'astuce du script dynamique. Je ne l'ai jamais utilisé cependant.

1 votes

Oui, les requêtes ajax ne peuvent pas être faites 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 renvoie le javascript.

23voto

Ólafur Waage Points 40104

Si le fichier PHP que l'AJAX demande possède un fichier session_start() les informations de la session seront conservées. (à condition que les demandes soient dans le même domaine).

2 votes

En effet, c'est ce que j'ai oublié de faire :-)

8voto

Sz. Points 360

Eh bien, pas toujours. En utilisant des cookies, vous êtes bon. Mais le "Puis-je compter en toute sécurité sur la présence de l'identité ?" e voudrais prolonger la discussion avec un point important (surtout pour 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 des cookies. ( Comment c'est bon ou mauvais (<-- voir par exemple le commentaire le plus élevé ici) est une question distincte Si l'ID de session n'est pas visible, le problème le plus important des sessions basées sur l'URL n'est pas un problème avec les appels Ajax internes ; mais si c'est activé pour Ajax, c'est aussi activé pour le reste du site, donc voilà).

Dans le cas de sessions avec réécriture d'URL (cookieless), les appels Ajax doivent s'en charger eux-mêmes. que les URL de leurs requêtes sont correctement rédigées. (Ou vous pouvez mettre en place votre propre solution personnalisée. Vous pouvez même recourir au maintien des sessions du côté client dans les cas moins exigeants). Le point est le soin explicite nécessaire pour la continuité de la session, si l'on n'utilise pas de cookies :

  1. Si l'Ajax appelle juste extrait URLs verbatim de l'HTML (tel que reçu de PHP), cela devrait être OK, car ils sont déjà cuits (hum, cookified).

  2. S'ils doivent assembler l'ID de session doit être ajouté manuellement à l'URL. (Vérifier aquí ou les sources des pages générées par PHP ( avec réécriture d'URL sur ) pour voir comment faire).


De OWASP.org :

En effet, l'application web peut utiliser les deux mécanismes, les cookies ou les paramètres d'URL, ou même passer de l'un à l'autre (réécriture automatique d'URL) si certaines conditions sont remplies. réécriture automatique de l'URL) si certaines conditions sont remplies (par exemple, l'existence de clients web ne supportant pas les cookies ou lorsque les cookies ne sont pas acceptés). de clients web ne supportant pas les cookies ou lorsque les cookies ne sont pas acceptés pour des raisons de confidentialité).

D'un Forum Ruby poste :

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

0 votes

Des statistiques fiables sur le nombre de personnes qui ont session cookies désactivés ? (Je n'en ai pas trouvé. Seulement sur Javascript : cela semble être environ 2% aux USA/Europe et ~1,2% en moyenne mondiale).

0 votes

Les identifiants de session sur l'URL sont dépassés, insécurité pratique. Sur le web d'aujourd'hui, personne ne doit partir du principe qu'il peut surfer avec des cookies désactivés et se connecter aux sites web où il possède un compte. Si l'un de vos visiteurs a désactivé les cookies, il est probablement prudent de supposer que soit a) il ne souhaite pas pouvoir se connecter à un site pour des raisons de confidentialité, soit b) il l'a fait accidentellement et ne peut plus se connecter à un site Web. tout site, pas seulement le vôtre.

3voto

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, afin qu'elle ne soit pas accessible à d'autres personnes qui n'ont pas la session obtenue après la connexion de l'administrateur. Est-ce que cela a un sens ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X