IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Récupérer valeur cookie


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 5
    Points
    5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 551
    Points
    8 551
    Billets dans le blog
    17
    Par défaut
    Donne-nous un script fonctionnel à tester

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 551
    Points
    8 551
    Billets dans le blog
    17
    Par défaut
    "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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
     
    header('Content-Type: text/plain') ;
     
    print_r($_COOKIE) ;
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setcookie('clef',$clefIdentifianteUnique, time() + 3600, null, null, false, true);
    Et ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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")
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    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!

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 551
    Points
    8 551
    Billets dans le blog
    17
    Par défaut
    Par ailleurs, comment fonctionne header (text/plain) et print_r ? On dirait un printf de C. (je débute en php).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer valeur cookie (gatling)
    Par pres62 dans le forum Scala
    Réponses: 0
    Dernier message: 01/10/2013, 10h33
  2. Récupérer valeur contrôle en dynamique via requête
    Par nicburger dans le forum Access
    Réponses: 10
    Dernier message: 15/09/2005, 15h41
  3. [ActionScript] Récupérer valeur balise <param />
    Par JohnBlatt dans le forum Flash
    Réponses: 1
    Dernier message: 18/07/2005, 14h50
  4. CR9 - Récupérer valeurs multiples d'un champ paramètre
    Par CR9-Deb dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 06/07/2005, 16h08
  5. récupérer valeur d'un ID après insertion
    Par rikidi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/08/2003, 22h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo