Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2010, 23h25   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
Par défaut Récupérer valeur cookie

Bonjour,

Pour mettre en place un système de ticket pour sécurisé la connexion à mon site, je dois utilisé des cookies.

Seulement je n'arrive pas à récupérer la valeur de ces cookies, et là je suis vraiment coincé (inutile de préciser que j'ai fais des recherches).

Je vous met les extraits de code concernés:

Code :
1
2
3
4
5
6
7
8
9
$clefIdentifianteUnique = genClef(); //génère une clef identifiante unique grâce à la fonction genClef
				setcookie('clef',$clefIdentifianteUnique, time() + 3600, null, null, false, true);
				$_COOKIE['clef'] = $clefIdentifianteUnique;
				$_SESSION['clef'] = $clefIdentifianteUnique; //enregistre le code dans des variables de session
 
				$ticketIdentifiantUnique = genClef();
				setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
				$_COOKIE['ticket'] = $ticketIdentifiantUnique;
				$_SESSION['ticket'] = $ticketIdentifiantUnique;
Code :
1
2
3
4
<?php
session_start();
echo $_SESSION['ticket'] . '<br/><p>C:</p>' . $_COOKIE['ticket'] . '<br/><br/>';
echo $_SESSION['clef'] . '<br/><p>C:</p>' . $_COOKIE['clef'] . '<br/><br/>';
Merci!
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 23h49   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Donne-nous un script fonctionnel à tester
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 07h22   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php 
function genClef() //Fonction gen_reg_key()
{ 
	$key = "";//on initialise la variable $key à "vide"
	$max_length_reg_key = 50;//on définit la taille de la chaine (50 caractères)
	$chars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","1","2","3","4","5","6","7","9","0","@","$","£","#");//on définit le type de caractères ascii de la chaine (l'alphabet suffit amplement, mais libre a vous)
	$count = count($chars) - 1;//on comptabilise le nombre total de caractères possibles (26 pour l'alphabet)
	srand((double)microtime()*1000000);//on initialise la fonction rand pour le tirage aléatoire
	for($i = 0; $i < $max_length_reg_key; $i++) $key .= $chars[rand(0, $count)];//on tire aléatoirement les $max_length_reg_key caracteres de la chaine
	return($key);//on renvois la clé générée
}
 
 
try //test de la connexion
	{
		$bdd = new PDO('mysql:host=localhost;dbname=****','****','****'); //connexion
	}
	catch (Exception $e)
	{
		die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
	}
	if(isset($_POST['pseudo']) AND isset($_POST['passe']))
	{
 
		$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE pseudo = ?');
		$requete->execute(array($_POST['pseudo']));
		$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
 
		if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
		{
			echo 'Pseudo incorrect';
		}
		else
		{
			$requete = $bdd->prepare('SELECT passe FROM membre WHERE pseudo = ?');
			$requete->execute(array($_POST['pseudo']));
			$reponse = $requete->fetch();
 
			if ($_POST['passe'] == $reponse['passe'])
			{
				session_start();
 
				$clefIdentifianteUnique = genClef(); //génère une clef identifiante unique grâce à la fonction genClef
				setcookie('clef',$clefIdentifianteUnique, time() + 3600, null, null, false, true);
				$_COOKIE['clef'] = $clefIdentifianteUnique;
				$_SESSION['clef'] = $clefIdentifianteUnique; //enregistre le code dans des variables de session
 
				$ticketIdentifiantUnique = genClef();
				setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
				$_COOKIE['ticket'] = $ticketIdentifiantUnique;
				$_SESSION['ticket'] = $ticketIdentifiantUnique;
 
				$_SESSION['pseudo'] = $_POST['pseudo'];
 
				echo '<a href="../../index.php">acceuil</a>';
				/*header('Location: ../../index.php');*/
 
				echo $_SESSION['ticket'] . '<br/>' . $_COOKIE['ticket'] . '<br/><br/>';
				echo $_SESSION['clef'] . '<br/>' . $_COOKIE['clef'] . '<br/><br/>';
 
			if($_SESSION['ticket'] == $_COOKIE['ticket'] AND $_SESSION['clef'] == $_COOKIE['clef'])
			{
			echo 'yes';
			}
			}
 
			else
			{
				echo 'Mot de passe incorrect';
			}
		}
 
		$requete->closeCursor();
	}
	else
	{
		echo 'ERREUR';
	}
	?>
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php 
function genClef() //Fonction gen_reg_key()
{ 
	$key = "";//on initialise la variable $key à "vide"
	$max_length_reg_key = 50;//on définit la taille de la chaine (50 caractères)
	$chars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","1","2","3","4","5","6","7","9","0","@","$","£","#");//on définit le type de caractères ascii de la chaine (l'alphabet suffit amplement, mais libre a vous)
	$count = count($chars) - 1;//on comptabilise le nombre total de caractères possibles (26 pour l'alphabet)
	srand((double)microtime()*1000000);//on initialise la fonction rand pour le tirage aléatoire
	for($i = 0; $i < $max_length_reg_key; $i++) $key .= $chars[rand(0, $count)];//on tire aléatoirement les $max_length_reg_key caracteres de la chaine
	return($key);//on renvois la clé générée
}
?>
<?php
session_start();
echo $_SESSION['ticket'] . '<br/><p>C:</p>' . $_COOKIE['ticket'] . '<br/><br/>';
echo $_SESSION['clef'] . '<br/><p>C:</p>' . $_COOKIE['clef'] . '<br/><br/>';
if(isset($_SESSION['clef']))
{
	if($_SESSION['ticket'] == $_COOKIE['ticket'] AND $_SESSION['clef'] == $_COOKIE['clef'])
	{
		$ticketIdentifiantUnique = genClef();
		setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
		$_COOKIE['ticket'] = $ticketIdentifiantUnique;
		$_SESSION['ticket'] = $ticketIdentifiantUnique;
 
		$membre = true;
		$session = true;
	}
	else
	{
		session_destroy();
		$membre = false;
		$session = true;
	}
}
else
{
	$session = false;
	$membre = false;
}
	?>
La plupart des echos sont là pour décorer tester le fonctionnement du script
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 03/12/2010, 09h37   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
"donner un script fonctionnel pour tests" ça ne veut pas dire coller tout le script posant problème mais juste une partie pleinement fonctionnelle pour nous (donc entre autres sans accès bdd) mettant en évidence le bug

En élaguant ton script avec :

test_setcookie1.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
function genClef() //Fonction gen_reg_key()
{
	$key = "";//on initialise la variable $key à "vide"
	$max_length_reg_key = 50;//on définit la taille de la chaine (50 caractères)
	$chars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","1","2","3","4","5","6","7","9","0","@","$","£","#");//on définit le type de caractères ascii de la chaine (l'alphabet suffit amplement, mais libre a vous)
	$count = count($chars) - 1;//on comptabilise le nombre total de caractères possibles (26 pour l'alphabet)
	srand((double)microtime()*1000000);//on initialise la fonction rand pour le tirage aléatoire
	for($i = 0; $i < $max_length_reg_key; $i++) $key .= $chars[rand(0, $count)];//on tire aléatoirement les $max_length_reg_key caracteres de la chaine
	return($key);//on renvois la clé générée
}
 
session_start();
 
$clefIdentifianteUnique = genClef(); //génère une clef identifiante unique grâce à la fonction genClef
setcookie('clef',$clefIdentifianteUnique, time() + 3600, null, null, false, true);
 
$ticketIdentifiantUnique = genClef();
setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
 
echo '<a href="test_setcookie2.php">Page 2</a>' ;
test_setcookie2.php :

Code :
1
2
3
4
5
<?php
 
header('Content-Type: text/plain') ;
 
print_r($_COOKIE) ;
J'obtiens :

Code :
1
2
3
4
5
6
Array
(
    [clef] => 1VTvKwxh1#pavQ6SGYBxkvBYSZai4hXldZWghYMQzIyaVdU9DY
    [ticket] => K1mPeFFtmfmVBTIYT7qZHZIM2£gJfJmGufHZ9Ttq9$ppW#KLyy
    [PHPSESSID] => t2v62luoi13j90lj0j8ht10io5
)
Donc le cookie est correctement créé et accessible.
Ces scripts fonctionnent-ils chez toi ?
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 09h56   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
Salut

Citation:
La plupart des echos sont là pour décorer tester le fonctionnement du script
Faire un retour sur ce que contient $_SESSION et $_COOKIE aurait été une info fort utile.

Je remarque ceci :
Code :
1
2
 
setcookie('clef',$clefIdentifianteUnique, time() + 3600, null, null, false, true);
Et ça :
Code :
echo '<a href="../../index.php">acceuil</a>';
Le index.php et cette autre page ne se trouverait pas au même niveau, pas dans le même répertoire.
Enfin, c'est ce que j'en déduis.


Et la doc dit ceci pour la fonction setcookie() : (particulièrement pour le 4ème paramètre "path")
Citation:
path

Le chemin sur le serveur sur lequel le cookie sera disponible. Si la valeur est '/', le cookie sera disponible sur l'ensemble du domaine domain. Si la valeur est '/foo/', le cookie sera uniquement disponible dans le répertoire /foo/ ainsi que tous ces sous-répertoires comme /foo/bar/ du domaine domain. La valeur par défaut est le répertoire courant où le cookie a été défini.
Donc si je me réfère à tout ça, n'ayant pas spécifié de path en particulier, le cookie sera alors dépendant du répertoire courant.
Si les 2 pages ne sont pas au même niveau, dans le même répertoire, alors lors le navigateur ne va pas renvoyer le cookie.
Au bout, le $_COOKIE attendu coté serveur n'y sera pas.

Pour résoudre ça, le plus simple est de faire comme ceci :
Code :
setcookie('clef', $clefIdentifianteUnique, time() + 3600, '/', null, false, true);
Le cookie sera envoyé quelque soit l'arborescence du site, de l'ensemble du domaine en faite.

On peu cependant définir le répertoire concerné, mais il faut que ce cookie soit exploité uniquement dans ce même répertoire.


Concernant la session, il y a des chance quelle y soit, et encore, faut voir, ça se peut que le problème soit le même.
Si tel est le cas, il faudra là aussi y faire la même manip pour le cookie de session.


Enfin, c'est une idée.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 13h47   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
Oups, on dirait que j'avais encore les yeux fermés ce matin. Je vais aller modifier mes identifiants.

Tout d'abord merci à vous deux.

Pour le retour: $_SESSION et $_COOKIE contienne tous les deux les infos attendues tant que je reste sur le script de connexion. Mais quand je passe à l'index, $_COOKIE ne renvoie rien.

Donc je pense que le problème doit venir de l'accès au cookie suivant le répertoire. J'avias lu une note là dessus, mais c'était tellemenr clair que j'avais compris que les cookie était pas défaut accessible sur tout le site

Donc je vais essayer cette solution.

Par ailleurs, comment fonctionne header (text/plain) et print_r ? On dirait un printf de C. (je débute en php).

Merci pour votre aide!
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 14h28   #7
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
Par ailleurs, comment fonctionne header (text/plain) et print_r ? On dirait un printf de C. (je débute en php).
Code :
header('Content-Type: text/plain') ;
Je préviens le navigateur qu'il devra afficher du texte simple, pas de HTML.

Cela sert à introspecter la variable, le content-type sert à garder le formatage.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h36.


 
 
 
 
Partenaires

Hébergement Web