[PHP] Déconnexion de Session non voulue

Fermé
silver_angel - 26 déc. 2008 à 21:58
 toto - 1 janv. 2009 à 12:30
Bonsoir,

je rencontre actuellement un problème sur un site dont je suis le webmaster (j'utilise un hébergeur en ligne).
Le site en question utilise les sessions php, et je rencontre le problème suivant : à chaque fois qu'un utilisateur connecté accède à une page qui n'est pas juste en dessous du répertoire www/ mais dans un sous-répertoire, cela ferme sa session. Le même code marche correctement en local sous EasyPhp, et je suis à peu près sûr que ça marchait correctement il y a peu sur le site.

La ligne contenant l'affectation de la variable session.save_path du fichier php.ini du répertoire www/ est commentée, c'est pourquoi je pense que cela est géré à un niveau auquel je n'ai pas accès (j'ai quand même essayé de la décommenter et de créer le répertoire adéquat, mais sans succès). Je ne sais en fait pas trop comment tout ça marche... est-il possible que cela vienne de l'hébergeur ? Avez-vous des idées de solutions ?

Merci d'avance,

silver angel
A voir également:

10 réponses

Bonjour

Que ça vienne ou non de l'hébergeur, c'est un peu tôt pour le dire.
Peux-tu montrer le code d'une page qui a un lien ou un formulaire vers un sous-répertoire où on perd la session, ainsi que celui de la page où la session est perdue ?
Eventuellement, ne donne que les partie utiles du code et surtout pense à cacher les mots de passe s'il y en a.
0
silver_angel
27 déc. 2008 à 15:15
Bonjour,

toutes les pages commencent plus ou moins de la même manière :

<?
include_once("[../]fonctions.php");
session_start();
printheader("...");
$db = connexion_db();
require_once("[../]debut.php");
debut(1,$db,1); // par exemple, pour une page publique du répertoire courant
?>


la fonction "debut($public,$db,$origin)" affiche les en-têtes et les liens en fonction du niveau de protection de la page (public, privé, protégé, admin), du type du compte et de la connexion (non-connecté, connecté - type 1, 2 ou admin), et $origin sert à définir le niveau de profondeur pour les liens (les pages du répertoire courant sont ensuite préfixées de "", les pages au-dessus de ".." et les pages en dessous du nom du répertoire qui va bien.

En fait, la fonction debut commence comme suit :

        if(!isset($_SESSION['user']))
	{
		$cas = 1;
		
		if(isset($_POST['login']))
		{
		   ...
		}
	}
	else
        {
                // cas correspondant à un utilisateur déjà connecté
		$cas = 4;
		$username = $_SESSION['user'];
	}

	if (isset($_REQUEST['deconnexion']))
	{
		   ...
		   $cas = 1;
		   ...
	}


Le cas 1 correspond à un utilisateur non connecté, le cas 4 à un utilisateur déjà connecté. En affichant des traces de debug, je vois bien que pour les pages du même répertoire (qu'elles soient privées ou publiques), la session reste ouverte (cas = 4), et pour les pages situées dans un répertoire en-dessous, la session est déconnectée (cas = 1, du haut).

Je rappelle que le code marche en local et marchait sur le serveur il y a quelques temps. Je pense que le problème ne vient du code lui-même mais plutôt d'un fichier de configuration quelconque de php...

Merci,

silver angel
0
Peux-tu montrer la génération d'un lien qui fais référence à une page dans un sous-répertoire ?

Sinon, parmi les classiques, es-tu sûr du respect des majuscules/minuscules dans les noms de sous-répertoires ?
0
silver_angel
27 déc. 2008 à 17:12
Par exemple :

   if ($origin == 0){
      $pre = "";
      $pre2 = "pages/";
   }
   else {
      $pre = "../";
      $pre2 = "";
   }
   ....
   println("	<div class=\"Body\">");
   println("		<a href=\"${pre}lien1.php\">Lien 1</a>"); // Lien vers une page juste en dessous de www/
   println("		<a href=\"${pre2}lien2.php\">Lien 2</a>"); // Lien (correct) vers une page du sous-rep "www/pages/", qui provoque la déconnexion
   println("	</div>");


Sinon oui, c'est ok pour les min/maj, et j'ai vérifié que les liens sont ok sur les pages générées...
0
je suppose que le [..] ci-dessous est présent ou non selon le niveau de sous-répertoire dans lequel on est.
include_once("[../]fonctions.php");
Il est possible qu'il y ait là quelque chose qui se passe mal. As-tu essayé de remettre le session_start(); AVANT le include_once ?
0
silver_angel
27 déc. 2008 à 18:00
"je suppose que le [..] ci-dessous est présent ou non selon le niveau de sous-répertoire dans lequel on est. "
Oui.

"Il est possible qu'il y ait là quelque chose qui se passe mal. As-tu essayé de remettre le session_start(); AVANT le include_once ?"
Je viens d'essayer, ça n'a rien changé.
0
Ajoute var_dump ($_SESSION); juste après le session_start(); d'une page où, selon toi, la session se déconnecte.
0
silver angel
30 déc. 2008 à 13:13
Désolé pour le retard de ma réponse - j'ai eu un problème d'internet ces 2-3 derniers jours...

J'ai donc ajouté cette ligne, et j'obtiens bien :
"array(0) { }"
0

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

Posez votre question
Ta variable $_SESSION est effectivement vide ...
Peux-tu retirer ce var_dump ($_SESSION); et en remettre un à la fin de la page où il y a les liens qui ne fonctionnent pas ? Peut-être la session est-elle détruite par autre chose avant la fin de ta page.
0
silver angel
30 déc. 2008 à 19:04
Non, je viens de vérifier. Ceci dit, étant donné que la navigation à l'intérieur d'une session entre des pages situées juste en-dessous de www/ était ok, ça aurait été surprenant.
0
ça aurait été surprenant De toutes façons, c'est surprenant.
J'ai beaucoup de mal à croire que les sessions marchent sur certaines pages et pas sur d'autres seulement pour une question de répertoire.
Le fichier directement pointé par <a href=\"${pre2}lien2.php\"> commence -t-il bien par :
<?php
session_start();
var_dump($_SESSION);

(sans oublier le php après le <? et sans intercaler de include avant le session_start ?
0
silver angel
30 déc. 2008 à 21:11
Oui, précisément.
0
Désolé, je dois avouer que je n'ai plus d'idée de manips à faire pour coincer le problème.
Il reste la piste de l'hébergeur dont tu parlais au départ, mais je n'y crois guère.
Peux-tu recréer provisoirement un petit sous-ensemble avec une page principale et deux pages cibles, une dans le même répertoire et l'autre dans un sous-répertoire, et , s'il y a le même problème, mettre le lien ici ?
Soit le défaut disparait quand tu simplifies, et il faudra reconstruire la vraie application progressivement pour voir quel est l'élément qui provoque le problème
oui bien le problème subsiste et là .. ben je ne sais pas
0
silver angel
31 déc. 2008 à 11:37
Voilà, j'ai recréé un mini-test (c'est peut-être par ça que j'aurais dû commencer). 4 fichiers :

- connexion.php

<?php
session_start();
print("<html><body>\n");
if (!isset($_SESSION['test'])){
   print("Vous n'étiez pas connecté<br>\n");
   $_SESSION['test'] = 1;
   print("Vous êtes désormais connecté<br>\n");
}
else {
   print("Vous étiez connecté<br>\n");
}
print("<a href=\"test_connexion.php\">Lien</a> vers une page du même répertoire.<br>\n");
print("<a href=\"sousrep/test_connexion.php\">Lien</a> vers cette même page dans un sous répertoire.<br>\n");
print("<br><a href=\"deconnexion.php\">Se déconnecter</a><br>\n");
print("</body></html>\n");
?>



- test_connexion.php

<?php
session_start();
print("<html><body>\n");
if (!isset($_SESSION['test'])){
   print("Vous n'étiez pas connecté<br>\n");
}
else {
   print("Vous étiez connecté<br>\n");
}
print("<a href=\"connexion.php\">Se reconnecter</a><br>\n");
print("</body></html>\n");
?>



- sousrep/test_connexion.php

<?php
session_start();
print("<html><body>\n");
if (!isset($_SESSION['test'])){
   print("Vous n'étiez pas connecté<br>\n");
}
else {
   print("Vous étiez connecté<br>\n");
}
print("<a href=\"../connexion.php\">Se reconnecter</a><br>\n");
print("</body></html>\n");
?>



- deconnexion.php

<?php
session_start();
session_destroy();
print("<html><body>\n");
print("Vous êtes déconnecté<br>\n");
print("<br><a href=\"connexion.php\">Se reconnecter</a><br>\n");
print("<br><a href=\"test_connexion.php\">Lien</a> vers test<br>\n");
print("</body></html>\n");
?>


l'adresse d'upload est http://www.goldeneye.fr/connexion.php

Ceci étant dit, y'a un truc curieux, c'est que j'ai essayé de mettre tous ces fichiers dans un sous-répertoire et non à la racine, et là ça marche...

Je vais écrire à mon host ; merci quand même pour l'aide.
0
bonjour silver angel

Et bonne année.
Je trouve qu'aucun de tes liens ne conserve la session, pas seulement les liens qui font changer de répertoire.
Mais ce qu'il y a de bizarre, et qui viendrait de ton hébergeur, ce sont les liens eux-mêmes : si je tape une adresse
http://www.goldeneye.fr/connexion.php le lien vers la même page est http://xx.xx.xx.xx/~goldeney//test_connexion.php.
1 - le double slash dans l'URL ne me semble pas normal
2 - on a changé de domaine.

En tapant directement l'URL avec l'adresse IP, je retrouve bien que la session est conservée quand on reste dans le même répertoire, et perdue quand on en change. J'ai fait une série de manips dont je ne tire malheureusement aucune conclusion cohérente.
Si un jour tu as le fin mot de l'histoire, peux-tu le mettre ici ? je serais curieux de comprendre.
0