Si un utilisateur était connecté à mon site et que son identifiant était enregistré dans $_SESSION
, et depuis son navigateur, il a cliqué sur un bouton "Enregistrer" qui ferait une demande AJAX au serveur. Est-ce que son $_SESSION
et les cookies sont conservés dans cette demande et puis-je m'appuyer en toute sécurité sur l'ID présent dans le $_SESSION
?
La réponse est oui:
Les sessions sont maintenues côté serveur. En ce qui concerne le serveur, il n'y a pas de différence entre une demande AJAX et une demande de page normale. Ce sont toutes les deux des requêtes HTTP. Elles contiennent toutes deux des informations sur les cookies 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 demande régulière ou d'une demande AJAX. Le code Javascript n'a pas besoin de faire quoi que ce soit de spécial ni même d'être au courant. Dans ce cas, cela fonctionne comme pour les demandes régulières.
Si le fichier PHP, le AJAX a un session_start()
] _), les informations de session seront conservées. (Les demandes sont affichées dans le même domaine )
Vous voulez vraiment savoir si les cookies sont envoyés avec la demande AJAX? En supposant que la demande AJAX concerne le même domaine (ou dans les limites du cookie), la réponse est oui. Ainsi, les requêtes AJAX sur le même serveur conservent les mêmes informations de session (en supposant que les scripts appelés émettent un session_start () comme tout autre script PHP souhaitant accéder aux informations de session).
Eh bien, pas toujours. En utilisant les cookies, vous êtes bon. Mais "puis-je compter sur l'id présent" m'a demandé de prolonger la discussion d'un point important (principalement à titre de référence, car le nombre de visiteurs sur cette page semble assez élevé).
PHP peut être configuré pour maintenir les sessions par réécriture d'URL, au lieu de cookies. ( Que ce soit bon ou mauvais (<- voir par exemple le commentaire le plus haut dans cette zone) est un question distincte , restons-en à la question actuelle, avec juste note latérale: le problème le plus important concernant les sessions basées sur des URL - la visibilité flagrante de l'ID de session nue - ne concerne pas les appels internes à Ajax, mais s'il est activé pour Ajax, il est activé pour le reste du site aussi, alors là ...)
En cas de session de réécriture d'URL (sans cookie), les appels Ajax doivent s'en occuper eux-mêmes pour que leurs URL de requête soient correctement créées. (Vous pouvez également utiliser votre propre solution personnalisée. Vous pouvez même recourir à la maintenance de sessions côté client , dans des cas moins exigeants.) Le point important est le soin explicite nécessaire pour la continuité de la session, si vous n'utilisez pas de cookies:
Si les appels Ajax appellent simplement extraire URL textuellement à partir du code HTML (tel que reçu de PHP), cela devrait être OK, car elles sont déjà cuites (umm, cookified).
S'ils ont besoin de assemble demander les URI eux-mêmes, l'ID de session doit être ajouté manuellement à l'URL. (Consultez 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 :
L’application Web peut effectivement 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 de l’URL) si certaines conditions sont remplies (par exemple, l’existence de clients Web ne prenant pas en charge les cookies ou lorsque les cookies ne sont pas acceptés pour des raisons de confidentialité de l'utilisateur).
D'un Ruby-forum post:
Lorsque vous utilisez php avec des cookies, l'ID de session est 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 demande Ajax.
Il est très important que AJAX demande que la session soit conservée. L'exemple le plus simple consiste à essayer de faire une demande AJAX pour le panneau d'administration, disons. Bien sûr que vous allez protéger la page à laquelle vous faites la demande, et non accessible aux autres personnes qui ne possèdent pas la session que vous obtenez après la connexion de l'administrateur.
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 soit évidemment présent. la session ne sera pas affectée.
Si l'application régénère des identifiants de session comme ceux-ci, vous pouvez vous retrouver dans une situation dans laquelle une demande ajax invalide/remplace l'identifiant de session dans la page de demande.
placez votre session () 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.
C'est ce que font les frameworks, par exemple Si vous initialisez une session dans Front Controller ou dans un script boostrap, vous n'aurez pas à vous soucier de son initalisation, que ce soit pour les contrôleurs de page ou les contrôleurs ajax. PHP) les frameworks ne sont pas une panacée, mais ils font tellement de choses utiles comme ça!