Rechercher : dans
Par :

AJAX et sessions

Dernière réponse le 11 jui 2008 à 10:22:27 Nabla's, le 9 jui 2008 à 14:50:36 
 Signaler ce message aux modérateurs

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 ...

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « AJAX et sessions » dans :
Ouvrir plusieurs sessions simultanément sous MSN/WLM VoirPar défaut, il n'est possible d'ouvrir qu'une seule session à la fois sous MSN Messenger ou Windows Live Messenger. Cependant, il est possible de modifier ce comportement et permettre ainsi l'ouverture et la connexion de plusieurs sessions en...
[Windows] Mot de passe de session perdu ou oublié VoirCette astuce vous aidera si vous avez perdu votre mot de passe de session. Cette méthode fonctionne jusqu'à Windows 2000, mais pas (ou plus ?) XP. Si vous n'êtes pas l'administrateur du système Il est nécessaire de demander à l'administrateur de...
Créer un script d'ouverture de session VoirWindows permet de définir des scripts d'ouverture de session, c'est-à-dire des scripts contenant des commandes exécutés dès qu'un utilisateur ouvre une nouvelle session. Les scripts d'ouverture de session permettant de lancer des tâches qui seront...
ASP - L'objet Session VoirIntroduction aux sessions Le protocole HTTP est un protocole non connecté (on parle aussi de protocole sans états, en anglais stateless protocol), cela signifie que chaque requête sur une page web est traitée indépendamment des autres et qu'aucun...
AJAX (Asynchronous Javascript And XML) VoirIntroduction à AJAX AJAX (Asynchronous Javascript And XML, traduisez Javascript asynchrone et XML) est une méthode de développement web basée sur l'utilisation d'un script Javascript pour effectuer des requêtes web à l'intérieur d'une page web...
Vol de session TCP (TCP session hijacking) VoirLe vol de session TCP Le « vol de session TCP » (également appelé détournement de session TCP ou en anglais TCP session hijacking) est une technique consistant à intercepter une session TCP initiée entre deux machine afin de la détourner. Dans la...

1

Nabla's, le 9 jui 2008 à 15:22:20

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....

Répondre à Nabla's

2

[o.o]REplay, le 9 jui 2008 à 16:23:01
  • +1

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.
~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

3

Nabla's, le 9 jui 2008 à 16:44:31

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 ...

Répondre à Nabla's

4

[o.o]REplay, le 9 jui 2008 à 18:13:22

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.
~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

5

Nabla's, le 10 jui 2008 à 09:49:58

Oui oui, je sais bien qu on peux passer du post et du GET, je fais les 2 en meme temps ...

Répondre à Nabla's

6

[o.o]REplay, le 10 jui 2008 à 10:21:19

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

Répondre à [o.o]REplay

7

Nabla's, le 10 jui 2008 à 15:06:50
  • +1

Bon, visiblement les sessions marchent normalement maintenant...
je sais pas ce qu il c est pasé.. l essentiel c est que ca marche!
et je suis passé en mode asynchrone et ca marche aussi. ca par contre je pense savoir d ou ca vient:
au debut, je voulais faire 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 = Actualise();
}



mais visiblement on a pas le droit de passer un nom de fontion existant...

Répondre à Nabla's

8

[o.o]REplay, le 10 jui 2008 à 15:16:48

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? ~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

9

Nabla's, le 10 jui 2008 à 15:38:28

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()};

Répondre à Nabla's

10

[o.o]REplay, le 10 jui 2008 à 15:46:27
  • +1

Oui oui t'as raison, il faut obligatoirement préciser "= function(){ }" , même si c'est vide :) ~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

11

Nabla's, le 10 jui 2008 à 15:58:56

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é

Répondre à Nabla's

12

[o.o]REplay, le 10 jui 2008 à 16:09:35

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 :) ~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

13

PhP, le 10 jui 2008 à 17:49:57

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 ...

Répondre à PhP

14

[o.o]REplay, le 11 jui 2008 à 08:24:29

C'est bon à savoir! merci :)
~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

15

Nabla's, le 11 jui 2008 à 09:01:09

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 ;)

Répondre à Nabla's

16

[o.o]REplay, le 11 jui 2008 à 09:36:06

Il ya 11 types de personnes: ceux qui comprennent le binaires, ceux qui ne le comprennent pas, et... ceux qui connaissent la blague ^^
~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

17

Nabla's, le 11 jui 2008 à 09:50:19

Mais quel sera le 100 eme groupe de personnes ?

Répondre à Nabla's

18

[o.o]REplay, le 11 jui 2008 à 10:09:27

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...)
~• Coin Coin •~
replay.homeunix.com

Répondre à [o.o]REplay

19

PhP, le 11 jui 2008 à 10:10:07

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.
PhP  
Il y a 10 types de personnes dans le monde : ceux qui comprennent le binaire et les autres ...

Répondre à PhP

20

 Nabla's, le 11 jui 2008 à 10:22:27

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

Répondre à Nabla's