Perte d'identification (Sessions + Cookies)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Perte d'identification (Sessions + Cookies)

Re: Perte d'identification (Sessions + Cookies)

par Kaoteknik » 28 oct. 2009, 00:36

Bonsoir à tous,

je ressors ce "vieux" post des entrailles du forum pour vous informer que j'ai fini par résoudre mon problème, et je suis... Comment dirai-je ? Aux anges, oui c'est bien ça ! :)

Afin d'y voir plus clair j'ai épuré mon code de tout ce qui n'était pas essentiel au fonctionnement des sessions à travers des pages incluses par un switch. Voici ce que ça donne...

Pour la page index.php :
<?php
include ('open_session.php')	;

if (isset($_POST['page'])) 
{
	$page = $_POST['page'];
}
else
{
	$page = 1 ;
}

switch ($page) 
{
	case 1 : include ("page_1.php");
	break;
	case 2 : include ("page_2.php");
	break;
}
?>
Le ficher open_session.php :
<?php
session_start();

if (!isset($_SESSION['pseudo']) && !isset($_SESSION['pass']))
{
	$_SESSION['pseudo']	=	''	;
	$_SESSION['pass']	=	''	;
}

if ($_POST['pseudo'] == 'MonPseudo' && $_POST['pass'] == '123456')
{
	$_SESSION['pseudo'] = $_POST['pseudo'];
	$_SESSION['pass'] = $_POST['pass'];
	echo 'Bienvenue '.$_SESSION['pseudo'].'<br />';
	echo '<a href="disconnect.php">Deconnexion</a>';
}
else
{
	if (!empty($_POST['pseudo']) || !empty($_POST['pass']))
	{
		echo 'Mauvais pseudo ou mot de passe<br />';
	}
	$_SESSION = array();
	include ('form.php');
}
?>
Le fichier form.php :
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
	Pseudo : <input type="text" name="pseudo" /><br />
	Mot de passe : <input type="text" name="pass" /><br />
	<input type="submit" name="submit" value="Envoyer" />
</form>
le fichier page_1.php :
<br /><br />

Vous êtes sur la page 1

<br /><br />

<form method="POST" action="<?php $_SERVER['PHP_SELF']; ?>">
	<input type="hidden" name="page" value="2" />
	<input type="hidden" name="pseudo" value="<?php echo $_SESSION['pseudo']; ?>" />
	<input type="hidden" name="pass" value="<?php echo $_SESSION['pass']; ?>" />
	<input type="submit" name="" value="Aller à la page 2" />
</form>
Le fichier page_2.php :
<?php
if (empty($_SESSION['pseudo']) || empty($_SESSION['pseudo'])) 
{
	echo 'Vous devez vous identifier pour parcourir cette page';
}
else 
{
?>

	<br /><br />
	
	Vous êtes en page 2
	
	<br /><br />
	
	<form method="POST" action="<?php $_SERVER['PHP_SELF']; ?>">
		<input type="hidden" name="page" value="1" />
		<input type="hidden" name="pseudo" value="<?php echo $_SESSION['pseudo']; ?>" />
		<input type="hidden" name="pass" value="<?php echo $_SESSION['pass']; ?>" />
		<input type="submit" name="" value="Retour" />
	</form>

<?php
}
?>
Et enfin le fichier disconnect.php :
<?php
session_start();
unset($_SESSION);
session_destroy();
header ('Location:index.php');
?>
Apparemment tout semble fonctionner comme je le souhaitais, il ne reste plus qu'à habiller tout ça avec un peu de css.

Encore une fois merci pour l'aide que vous m'avez apporté.

Re: Perte d'identification (Sessions + Cookies)

par fab » 20 oct. 2009, 21:54

ou si tu veux pas tester à chaque fois dans ton fichier que tu inclues un peu partout tu testes l'existence et si ça existe pas tu initialises :)

Re: Perte d'identification (Sessions + Cookies)

par Kaoteknik » 20 oct. 2009, 21:50

Est-ce à dire que dans chacune de mes pages il faudrait que je teste leur existence ?

Je vais tester ça de ce pas...

Re: Perte d'identification (Sessions + Cookies)

par fab » 20 oct. 2009, 21:40

Y a vraiment besoin de les initialiser si tu vérifies leurs existences avec un isset() au moment des les utiliser :)

Re: Perte d'identification (Sessions + Cookies)

par Kaoteknik » 20 oct. 2009, 21:08

Hum, en effet, c'est idiot de ma part... Evidemment je rappelle le fichier index.php à chaque page puisque pour appeler une page j'utilise un formulaire dont l'action est $_SERVER['PHP_SELF']. Et comme au début de ce fichier j'initialise mes variables de session, il m'apparaît normal (maintenant que vous le dites) qu'aucune valeur ne soit enregistrée d'une page à l'autre...

Mais dans ce cas où dois-je initialiser ces variables pour qu'elles ne soient pas récurrentes ?

[edit]
Je viens de tester autre chose, mais ça ne fonctionne pas pour autant. J'ai remplacé le début de mon fichier index.php par ceci :
<?php
	session_start();

	if (isset($_POST['submit']))
	{
		if (empty($_SESSION['pseudo']) || empty($_SESSION['pass'])) 
		{
			$_SESSION['pseudo'] = '' ;
			$_SESSION['pass'] = '' ;
		}
		else
		{ //suite du code
Je me suis dit qu'en testant tout d'abord si mes variables de sessions étaient vides je pouvais les initialiser, et dans le cas contraire exécuter les différents contrôles, mais ça n'est guère mieux...

Il me vient subitement à l'esprit une chanson des Beatles : "Help, I need somebody help..." ! :)

Re: Perte d'identification (Sessions + Cookies)

par graffx » 20 oct. 2009, 20:40

:mrgreen:

$_SESSION['pseudo'] = '';
$_SESSION['pass'] = '';

Re: Perte d'identification (Sessions + Cookies)

par fab » 20 oct. 2009, 20:26

Tu incluerais pas ton premier fichier sur les autres pages par hasard? si c'est le cas c'est normal que tu te trouves avec des valeurs vides car en tout début de fichiers tu réinitialises tes variables de session.

De plus le session_start() au début de chaque page n'est pas une broutille mais une obligation si tu veux utiliser les variables de sessions :)

Perte d'identification (Sessions + Cookies)

par Kaoteknik » 20 oct. 2009, 19:19

Bonsoir à tous,

voilà plusieurs soirs que je cherche une solution à mon problème, après lecture de tutoriels et autres documentations (que l'on trouve pourtant à foison), sans résultat.

J'expose les faits : j'ai un formulaire d'identification classique (avec un champ "pseudo" et un champ "mot de passe", ainsi qu'un bouton "connexion"). Si un utilisateur s'identifie correctement, pas de souci, une session est créée... Mais lorsqu'il navigue sur les différentes pages du site, la session se perd, sans que je parvienne à m'expliquer pourquoi.

La navigation s'opère à l'aide de la fonction SWITCH et, lorsqu'on passe d'une page à une autre, la fonction INCLUDE vient charger la page demandée, en remplacement de la précédente.

Voici le code de mes différentes pages, pour vous aider à y voir plus clair. Tout d'abord l'index.php qui affiche le formulaire d'identification et inclue le fichier body.php :
<?php
	session_start();
	$_SESSION['pseudo'] = '';
	$_SESSION['pass'] = '';

	if (isset($_POST['submit']))
	{
		if (empty($_POST['pseudo']) || empty($_POST['pass'])) 
		{
?>

			<div class="cadre_identification">
				Vous n'avez pas rempli le formulaire.<br />
				<a href="<?php  $_SERVER['PHP_SELF'] ?>">Retour</a>
			</div>

<?php
			include ('body.php') ;
		}
		else {
			require_once ('connexion/configbdd.php');
			$connexion = mysql_connect($dbhost, $utilisateur, $mdp) or die (mysql_error()) ;
			mysql_select_db (maBase, $connexion) or die (mysql_error()) ;

			extract($_POST);
			$requete = mysql_query ("SELECT pseudo, pass, admin FROM users WHERE pseudo='$pseudo'") ;
			$resultat = mysql_fetch_array ($requete) ;
			
			if ($resultat['pseudo'] == $pseudo && $resultat['pass'] == $pass) 
			{
				$pseudo = (isset($_POST['pseudo'])) ? $_POST['pseudo'] : '';
				$pass  = (isset($_POST['pass']))  ? $_POST['pass']  : '';
				
				$date_expiration = time() + 365*24*3600;
				setcookie('pseudo', $pseudo, $date_expiration);
				setcookie('mot_de_passe', $mot_de_passe, $date_expiration);
				$_SESSION['pseudo'] = $pseudo;
				$_SESSION['pass'] = $pass;
?>

				<div class="cadre_identification">
					<?php
						include ('form_connect.php') ;
					?>
				</div>

<?php
				include ('body.php') ;
			}
			else
			{
?>

				<div class="cadre_identification">
					Votre pseudo et/ou votre mot de passe sont incorrects.<br />
					<a href="<?php  $_SERVER['PHP_SELF'] ?>">Retour</a>
				</div>

<?php
				include ('body.php') ;
			}
		}
		
	} 

	if (!isset($_POST['submit']))
	{
?>
						<div class="cadre_identification">
							<?php
								include ('form_ident.php') ;
							?>
						</div>

<?php
		include ('body.php') ;
	}
?>

body.php insère un SWITCH qui permet de naviguer entre les différentes pages du site :
<div class="cadre_central">
					<?php 
						$carte = $_POST['carte'];
						
						switch ($carte){
						case 1 : include ("pages_cartes/carte_generale.php");
						break;
						case 2 : include ("pages_cartes/carte_1.php");
						break;
						case 3 : include ("pages_cartes/carte_2.php");
						break;
						case 4 : include ("pages_cartes/carte_3.php");
						break;
						default : include ("pages_cartes/carte_generale.php");
						break;
						}
					?>
					
</div>
carte_generale.php est la page par défaut :
<center>
	<table>
		<tr>
			<td colspan="3">
				<h3>Cliquez sur une carte pour l'agrandir.</h3>
			</td>
		</tr>

		<tr>
			<td>
				<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
					<input type="hidden" name="carte" value="2" />
					<input type="submit" name="" value="" class="mini_carte" style="background-image:url(images/cartes/a_1.jpg);" />
				</form>
			</td>

			<td>
				<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
					<input type="hidden" name="carte" value="3" />
					<input type="submit" name="" value="" class="mini_carte" style="background-image:url(images/cartes/a_2.jpg);" />
				</form>
			</td>

			<td>
				<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
					<input type="hidden" name="carte" value="4" />
					<input type="submit" name="" value="" class="mini_carte" style="background-image:url(images/cartes/a_3.jpg);" />
				</form>
			</td>
		</tr>
	</table>
</center>
Enfin voici les fichiers carte_1,2,3.php, toutes construites sur le même modèle :
<div>
<img src="images/cartes/g_c8.jpg" />
</div>
				
<a href="index2.php?page=carte_generale"><h2>Retour à la carte générale</h2></a>

J'ai essayé de multiples combinaisons, comme insérer dans chaque page un session_start(); ou d'autres cafouillages du genre, mais rien à faire, un visiteur ne peut garder sa session au fil des pages, le formulaire d'identification réapparaît systématiquement, alors que devrait rester affiché le message "Bienvenue X, Y ou Z".

Heureusement je ne suis pas armé (quoi que, j'ai peut-être une corde qui traîne au fond d'un placard), sinon qui sait à quelle extrémité je pourrai en arriver... Mais non, je ne me laisserai pas vaincre par "kaoteknik", je persévère, et je sais qu'ici je peux trouver tout le réconfort dont j'ai besoin ! :D

Merci, et à très bientôt.

PS : je précise (mais j'imagine que ça se voit), je débute totalement avec les sessions et cette notion est encore très abstraites à mes yeux.