Changement aléatoire d'une variable de session
Bonjour,
un bug sur lequel je bute depuis plusieurs jours :
Je suis sur une release2 d'OVH en Gentoo.
je fais une première page de formulaire avec <? session_start(); ?>
Dans ce formulaire, je crée un token :
$token = md5(uniqid(rand(), true));
j'enregistre le token comme variable de session : $_SESSION['token']=$token;
Pour débugger , je le fais écrire cette variable :
echo "token = $_SESSION['token']" <br>;
ainsi que l'identifiant de session.
Mon formulaire envoie (en get) le token qui est comparé à la variable de session pour activer la page 2. Ca ne fonctionne pas.
Je reste sur la page 1, je rafraîchis, je note le session _ID et par ftp je le télécharge et l'ouvre : la variable de session token est différente et correspond à celle qui sera lue dans la page 2 ?????
Alors que la page 1 relis bien la variable stockée, celle qui apparaît dans le fichier de session est différente. Si je remplace le token par une chaîne de caractères 'mavariable', alors là, tout est OK, la variable de session affichée dans la page1, celle affichée dans la page2 et celle contenue dans le fichier session_id est bien 'mavariable'.
Quelqu'un a t'il une idée ? J'ai une vingtaine de sites, ce problème ce déclare aléatoirement sur 2 sites.
le code de la page 1:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
<?PHP
ini_set('session.save_path','/home/xxxxxxxx/www/sessions');
session_start();
?>
$token = md5(uniqid());
$_SESSION['token'] = $token;
echo "tok=".$token." et session = ".$_SESSION['token']." <br>";
$nom = session_name();
$id = session_id();
echo "nom session: $nom<br>";
echo "id session: $id<br>";
//le lien pour agrandir l'image :
<a href="javascript:JOpenWn('window_rdp.php?img_name= <?echo $image;?>&img_w=<?echo $width;?>&img_h=<?echo $height;?>&tok=<?echo $token;?>','photo','scrollbars=yes,resizable=yes,w idth=<?echo $width2;?>,height=<?echo $height2;?>')">
<img src="<?echo $image_m;?>" width="75" alt="clic pour agrandir"></a> |
le code de la page 2 :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
<?php
ini_set('session.save_path','../sessions');
session_start();
$tok=$_GET['tok'] ;
$session=$_SESSION['token'];
//echo "tok=".$tok." et session = ".$_SESSION['token']." <br>";
if (isset($_SESSION['token'])&& $tok == $_SESSION['token']){
...} |
Ces codes sont à l'identique de ceux qui fonctionnent sur d'autres sites hébergés sur le même serveur et configurés de la même manière.
La question est de comprendre pourquoi quand je fais en page 1
$_SESSION['token'] = $token;
echo " session = ".$_SESSION['token']." <br>";
je ne retrouve pas cette variable sauvegardée dans le fichier de session alors que le echo est OK ???
Merci pour votre aide.
variable de sessions bizares
Oui je vais essayer, comme c'est aléatoire, e, effet cela pourrait venir d'une réinitialisation des variables, même si je ne vois pas d'où...
Le problème est que pour l'instant, ça fonctionne, donc je ne peux pas faire l'essai. Dès que ça replante, je tente.
Merci pour ton aide.
il y a un truc qui m'échappe...
il doit me manquer un morceau du puzzle car...grâce à ta suggestion, ça fonctionne mais je ne comprends pas pourquoi.
D'abord les réponses aux essais que tu me suggères :
1 -Utilise une variable fixe : oui ça marche tout le temps même après pleins de F5
2- variable aléatoire : ça déconne sauf si je fais un isset comme tu le suggères.
Je dois donc faire une erreur dans mon raisonnement. Voilà ce que je pensais faire :
page 1 qui affiche des miniatures :
un session_start() ; pour commencer
ensuite je crée ma variable
$token = md5(uniqid(rand(), true));
je range ma variable dans la session :
$_SESSION['token'] = $token;
ma variable $token est créée, je l'ai rangée dans la session donc à ce moment là je dois avoir la variable $token et la variable $_SESSION['token'] identiques.
si par FTP je vais chercher le fichier de session (identifié par session_id) et que je l'ouvre, je vois une autre variable comme valeur de token.
C'est donc normal que lorsque dans la page 1, j'envoie $token en get, et que dans la page 2 je le compare à $_SESSION['token'] , je trouve une différence. Par contre le $_SESSION['token'] lu dans la page 2 est bien celui que je lis dans le fichier de session.
Pour moi, à chaque fois que je fais F5, je re initialise une nouvelle variable, je range la nouvelle variable dans ma session et ça doit marcher.
Dans ce que tu suggères par le isset, cela évite à chaque rechargement de page de créer une nouvelle variable...mais où est le problème ?
Suivant tes conseils , j'ai fait ceci :
Code:
1 2 3 4 5 6 7 8
|
if (!isset($_SESSION['token']))
{
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
}else
{$token=$_SESSION['token'];
echo "token=".$_SESSION['token']."";} |
si la variable de session existe déjà, je donne à la valeur que je vais envoyer en GET la valeur de cette variable de session et là c'est OK.
Toujours convaincu qu'il y a une disparité entre ces 2 variables, j'ai à nouveau enlevé le isset et j'ai fait ça :
Code:
1 2 3 4
|
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
$token=$_SESSION['token']; |
Je redonne à ma variable $token la valeur lue dans la session. Ca plante !
J'y comprends rien. Où fais-je erreur dans mon raisonnement ?