AJAX et sessions

Résolu
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   -  
 N-ectron -
Bonjour,

Bonjour. Je realise acutelement une application dans le cadre de mon stage, et en ce moment je suis sur une partie en ajax

j ai un formulaire qui envoie des données a un script php via ajax
le formulaire est sur une page php, les et j utilise les sessions pour garder des informations. or, lorsque j utilise ma fonction ajax, mon formulaire recoit bien les donnés, mais n identifie pas la session.... le cookie PHPSESSID n est pas transmis

es ce que vous auriez une technique pour tranmettre ce cookie, ou pour ecrire dans le header de la requette envoyé avec l oject XMLHttpRequest ???

sinon, si ce n est pas possible, est il possible de faire passer le PHPSESSID dans l URL, et que la meme session soit reconnu (je sais qu on peut faire la session par url pour les clients n ayant pas de cookies, mais vu que ca pose surement des problemes de securité: vol de session, je pense qu un controle est fait pour voir si la session utilise bien toujours la methode URL ou COOKIE, qu il n y ai pas de changeæent en cours de route)

merci d avance pour toute reponse, ou demande de precision si j ai été trop flou dans mes descriptions ...

13 réponses

Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
bon, pour l instant j ai fait ca dans la page du formulaire, bien sur la session est ouverte en debut de page et on n accede a cette page que si on est dans une sessuiin utilisateur:

xhr_object.open("POST", "ajax.php?PHPSESSID=<?php echo $_COOKIE['PHPSESSID']; ?>", false);

donc je recupère l identifiant session....

et dans le fichier ajax.php je fais ca:

<?php

session_start();

if (isset($_SESSION['login']))
{

}
?>

et ca marche....

donc on peut a priori sur ma configuration (wamp 2.0) utiliser dans une URL une session qui a été crée sur un cookie.... c est pour moi une grosse faille de sécurité du PHP, mais ca m arrange bien ;)

doncm si vous faites de l ecoute reseau sur qqcn qui est connecté snas connection securisé (meme si le mot de passe a été passé en mode sécurisé), alors vous pouvez lui piquer l identifiant de sa session avec wireshark par exemple, et l ajouter dans l URL du site.... et hop, vous squattez sa session....

si vous avez une meilleur solution pour faire passer la sessionm notement ecrire des parametres aditionels dans l entete de la requete envoyée par ajax, je suis preneur!!! je préfererai envoyer la session par les entetes....
3
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28
 
Bonjour,

Bizarre,
je n'ai jamais eu ce soucis: les variables de SESSION du serveur correspondaient bien --> mes cookie étaient bien transmis...

essaie après ton open:

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

:)


et autre chose:
xhr_object.open("POST", "ajax.php?PHPSESSID=<?php echo $_COOKIE['PHPSESSID']; ?>", false);

pourquoi pas true? : en asynchrone c'est bien plus pratique pour le client: il peut naviguer en attendant la réponse du serveur.

une derniére chose :p

Tu peux te créer une variable
var data= "PHPSESSID=<?php echo $_COOKIE['PHPSESSID']?>& etc... ;

et faire

xhr_object.open("POST", "ajax.php",false);
xhr_object.send(data);

je ne my connait pas plus que ça, ca revient surement au même.
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193 > [o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention  
 
merci de ta reponse.

alors pour le mode synchrone / asynchrone, il faut que je refase un essai, mais au debut ou je m en servais, j arrivais pas a le faire marcher en asynchrone, donc je suis passé a autre chose comme ca marchait en synchrone.... mais je croi savoir d ouvenait mon pb ;)

le xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
en fait je suis trop bete, j avais pas vue que j utilisait dans une autre page.... mais je te remercie de me l avori redonné

en revanche, pour le
var data= "PHPSESSID=<?php echo $_COOKIE['PHPSESSID']?>& etc... ;

xhr_object.open("POST", "ajax.php",false);
xhr_object.send(data);

ca ne peux pas marcher. la session doit etre passée en GET ou en cookie, pas en POST (enfin, j en ai jamais entendu parler, et j ai rien vu s y raportant dans la doc de php). et j envoie d autres choses en post, ét vu que je fais un peu mon traitement a la bourin, il faudrai que je fasse gaffe a ce parametter ...
D autant plus que si PHP ne le gère pas en natif (le cookie de session passé en post), ca me sert a rien de le recevoir! il faudrai que je le traite a la main, il faudrai réecrir le session_open(), donc nonm pas la bonne solition.

bonne solution:
xhr_object.setRequestHeader("Cookie", "<?php echo $_COOKIE['PHPSESSID']?>");

voila.. si qqcn a un probleme de session avec ses cookies ...
0
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28 > Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention  
 
Tu peux aussi bien passer les variables en POST qu'en GET avec l'objet xmlHTTPRequest. Il suffit juste de savoir s'en servir.

Pour le mode asynchrone, la réception des données est différente. Je n'ai pas de code sous la main, mais tu peux toruver des tuto en français assez facilement. Sinon je te file ca demain.
Et pour ce qui est des cookies, je n'ai jamais eu à faire ce que tu as fais:
Ma page php appelée me retrouvait bien mon identifiant et mon password par exemple dans mes variables SESSION.
Il doit y avoir un soucis quelque part :S faudrai tout ton code.......mais j'imagine que c'est assez long.

Bonne soirée.
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193 > [o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention  
 
oui oui, je sais bien qu on peux passer du post et du GET, je fais les 2 en meme temps ...
0
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28 > Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention  
 
Et sur ta page ajax.php par défaut, si tu fais un echo $_SESSION['login'] il te dit que la variable n'existe pas?

Je trouve ça étrange, car de mon côté, si je lance ma requête XmlHttpRequest depuis une page ou je suis logé, sur la page php appellée mes variables de SESSION sont bien définies :S C'est pourquoi je te dis que ça doit venir de ton header-> Si tu utilises le requestheader que je t'ai conseillé ça ne marche pas?
( xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); )

++

~• Coin Coin •~
replay.homeunix.com
0
PhP Messages postés 1770 Date d'inscription   Statut Membre Dernière intervention   606
 
Bonsoir

Normal que ca ne fonctionne pas car Javascript est case sensitive bref il est sensible aux majuscules/minuscules donc Ajax() ce n'est pas la même chose que ajax() hé non !

Donc si ta fonction se nomme ajax écrit:
setInterval("ajax()", 2000 ); //next reload of the page   



Ensuite si tu écris
xhr_object.onreadystatechange = Actualise(); 


la fonction Actualise est appelée exécutée et le résultat est affecté à onreadystatechange ce qui doit très certainement planter

A la place affecte la référence vers la fonction en écrivant :
xhr_object.onreadystatechange = Actualise;  // <-- pas de parenthèses ici !!!


Si ta fonction de callback s'appelle traitement évidemment ca donne :
xhr_object.onreadystatechange = traitement; 


CQFD

PhP  
Il y a 10 types de personnes dans le monde : ceux qui comprennent le binaire et les autres ...
2
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28
 
C'est bon à savoir! merci :)
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
salut. pour setInterval("ajax()", 2000 ); c est une faute de frape quand j ai recopié le nom de la fonction, car ca marche tres bien.

pour le reste, merci beaucoup

j adore ta phrase suir le binaire... elle doit en faire réflechir plus d une... parmis les autre ;)
0
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28 > Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention  
 
Il ya 11 types de personnes: ceux qui comprennent le binaires, ceux qui ne le comprennent pas, et... ceux qui connaissent la blague ^^
0
WibiMaster Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   1
 
Si tu t'adresse à moi, si, je l'appelle réellement deux fois ; en fait, mon appel Ajax me sert à changer le milieu de page, lequel, selon la page importée, a besoin des variables de session.
Du coup, si l'utilisateur n'active pas JavaScript, tout l'index est appelé (header compris), donc mon session_start est en haut de la page d'index. L'inclusion en milieu de page se fait par un include habituel.
Mais si l'utilisateur active JavaScript, l'inclusion en milieu de page se fait par Ajax, du coup l'index n'est pas rafraichi, est apparemment les variables de session doivent être re-appelé dans la page incluse.

Pour faire un petit résumé simplifié, parce que je commence à m'embrouiller :

Mon session_start est en haut de mon Index, ET en haut de mes pages que j'inclue.
Si l'inclusion se fait par Ajax, le premier session_start n'est pas pris en compte (car non-rafraichi), donc pas d'erreur de header, et les variables de sessions sont utilisables.
Si l'inclusion se fait en rechargeant toute la page, alors là oui, ça pose un problème de double-header.

Et si je ne met le session_start QUE en haut de mon Index, alors en cas de rechargement de la page, no problem', mais en cas d'inclusion par Ajax, il ne tient pas compte des variables de session (comme si le session_start n'avait jamais eu lieu).

C'est un peu bancal comme situation.. Mais j'ai finit par trouver (à cause d'un autre problème de caractère accentué ^^) un moyen détourné pour ne pas "cacher" d'erreur et pour que tout soit correct ;
quand je fais mon include en PHP, le fichier inclut fait partie de la page d'index, et du coup les chemins vers d'autres pages (dans cet include) doivent se faire par rapport à la page d'index (en relatif).
Quand je fais l'include en Ajax, la page est traité de manière désolidarisée de la page d'index, du coup le chemin (relatif toujours) vers d'autres pages (pendant le traitement) n'est plus le même (car mes pages incluses sont dans un dossier différent).

Il me suffit donc de tester un chemin vers une page existante avec un file_exist, selon si la réponse est true ou false, je sais si la page est incluse par PHP pur ou par Ajax, et donc mettre mon session_start ou non en conséquence.

Ça parait tordu, mais ca tient en une seule ligne, et ça résout presque tout mes problème liés à Ajax :)

Un exemple concret, pour ceux qui auraient du mal à me suivre :

Pages existantes :
/index.php
/pages/mapage.php
/inc/test.php

mapage.php est appelé par un include dans index.php.

Au début de index.php, j'ai donc la ligne <?php session_start() ?>
Il suffit de mettre en haut de mapage.php :
<?php if(file_exists('../inc/test.php')){session_start()} ?>

Ainsi, si la page est incluse par Ajax, le session_start() est à nouveau appelé. Sinon, pas besoin, le session_start() de l'index suffit.
1
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
si ca marche pas, tu peux utiliser cette fonction:
https://www.php.net/manual/fr/function.session-id.php

session_id
<?php if(session_id=="")){session_start()} ?>

session_id() retourne l'identifiant de session pour la session courante ou une chaîne vide ("") s'il n'y a pas de session courante (aucun identifiant de session n'existe). 
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28
 
Tu parle de setInterval?
Si oui, le problème ne viendrait-il pas du fait que tu appel la fonction ajax() dans ajax() elle-même?
Tu peux mettre setInterval ailleurs dans ta page non?
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
ca c est ce que j avais fait sur une page ou l asynchrone ne marchait pas
function traitement(){mon traitement ici}

function ajax(){
setInterval("Ajax()", 2000 ); //next reload of the page
xhr_object.open("POST", "Ajax.php", false);

xhr_object.send(null);
xhr_object.onreadystatechange = Actualise();


et je pense qu il vaut mieu faire comme ca:

function traitement(){mon traitement ici}}

function ajax(){
setInterval("Ajax()", 2000 ); //next reload of the page
xhr_object.open("POST", "Ajax.php", false);

xhr_object.send(null);
xhr_object.onreadystatechange = function(){traitement()};
0
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28
 
oui oui t'as raison, il faut obligatoirement préciser "= function(){ }" , même si c'est vide :)
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193 > [o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention  
 
voila... moi je m etait dis qu au lieu de faire une déclaration inline, j allais passer ma fonction existante, mais ca merdais a moitié
0
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28 > Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bah oui j'avoue,
C'est assez bizarre à utiliser,
La W3C ne l'a pas encore normalisé. Des documents ont été publiés afin de guider les webmasters, mais pas de standardisation pour l'instant.
allléé bonne journée :)
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
mais quel sera le 100 eme groupe de personnes ?
0
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28
 
ben nous, cad ceux qui ont compris ma blague...
Du coup on sera aussi le groupe 101,110.
Bref, nous sommes tous les groupes de personnes!

$groupe = '' ;
while(1)
$groupe .= '1';

(l'humour geek, ça crain des fois...)
0
N-ectron
 
@ [o.o]REplay
nan l'humour geek c'est cool.

Mais décale ton texte d'un demi pixel STP.
0
PhP Messages postés 1770 Date d'inscription   Statut Membre Dernière intervention   606
 
Bjr

la citation n'est pas de moi mais j'aime bien donc je l'ai reprise ;-)

Concernant le setInterval son utilisation ici n'est pas conseillée.

En effet setInterval appelle, comme son nom l'indique, à intervalle régulier ta fonction ajax().

Or si dans la fonction ajax() tu fais de nouveau appel à setInterval tu créés une sorte de boucle "récursive" qui risque de saturer la pile bref de planter le navigateur.

Remplace setInterval par setTimeout("ajax()",2000) pour éviter le problème

AJAX maintenant : c'est moins simple qu'il y paraît hélas ...
A priori tu réutilises la même requête xhr_object à chaquel appel à ajax()
Pour avoir tester ce n'est pas très fiable surtout avec IE6 : il vaut mieux détruire l'ancien objet xhr_object et en créer un nouveau.

Enfin tu sembles considérer que ta requête va toujours fonctionner bref que ta page Ajax.php va toujours répondre et ce dans un délai inférieur à 2 secondes : alors là ça n'engage que toi. C'est sur qu'en local ça fonctionne mais une fois sur le net ... Si le serveur est indisponible pour une raison ou pour une autre que se passe-t-il à ton avis si ta page Ajax.php met disons 10" avant de répondre ou bien ne répond pas du tout ?
Tu dois gérer ce cas de figue qui est en fait très fréquent ainsi que les autres erreurs AJAX.
Lorsque j'utilise AJAX je démarre un timer via setTimeout pour chaque requête et si au bout de mettons 10" la réponse n'est toujours pas arrivée alors j'annule la requête et j'avertis éventuellement l'utilisateur


Tu peux aussi utiliser un framework AJAX dans lequel tous les contrôles sont déjà intégrés : inconvénient tu n'apprends pas vraiment comment AJAX fontionne derrière.
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
merci pour ces info, c est vrai que c est un cas que je n ai pas envisagé.

ceci dit, le systeme que je developpe actuelement est un prototype, uen demonstration, et sera entierement repris par une boite specialisée developpment web, mais je retien ce que tu m as dis pour une fois ou je me lancerai dans un vrai site web!

le set timeout, je vais le remplacer tout de suite :D
0
WibiMaster Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour,

J'ai eu le même problème entre Ajax / SESSION..

J'ai trouvé une "solution" qui m'embarrasse un peu, parce qu'elle ne fait que camoufler le problème (tout en le résolvant un peu quand même ^^)

J'appelle tout simplement mon "session_start" dans toute les pages qui seront appelées avec Ajax. De cette manière, la SESSION fonctionne bien, mais bien sûr, il me dit que la session est initialisée deux fois dans le header, alors il aime pas. Mais avec un petit "@" devant, il n'affiche plus l'erreur, et reconnait bien à chaque fois la session.

C'est du bricolage, mais pas trouvé mieux encore...
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
ton problème est étrange, car de toute facon, dans n'importe quelle page qui utilise les sessions, il faut executer le session_start().
es tu sur de ne pas réellement l'appeller 2 fois, dans un include par exemple ?
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
oui, vu que mon message d'origine date d'il y a 18 mois, c'est bien à toi que je m'adresse....

à mon avis, tu peux faire un truc plus propre: tester l'existance de la session:

<?php if(file_exists('../inc/test.php')){session_start()} ?>
à remplacer par
<?php if(!isset($_SESSION[])){session_start()} ?>
à traduire par si le tableau de session n'a pas été déclaré (donc la session n' apas été créée), alors crées la session

je n'ai pas testé ce bout de code, mais j'espère qu'il t'inspirera

tiens moi au courrant si ca corrige le problème, ou si il y a besoin d'une modification dessus...
0
WibiMaster Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   1
 
La première méthode retourne une erreur (le [] vide qui dérange), mais la deuxième après correction fonctionne :)
Merci !
Ça revient un peu au même, mais faut avouer que c'est plus propre quand même...

Correction de la méthode "session_id" :

<?php if(session_id()==""){session_start();} ?>

(problème de parenthèses, une en trop et deux qui manquent ^^)

Merci encore !
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
désolé, c'était des copiers collé à l'arrache ;)
ca compense avec ton ; qui manquait et que du coup j'ai pas mis non plus.

Je pense que ton code sera plus élégant comme ca, plus facilement réutilisable et compréhensible
0