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 :

Session et CAPTCHA


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut Session et CAPTCHA
    Bonsoir à tous,

    Actuellement sur mon site j'utilise déjà un système de session pour se connecter et tout marche bien.

    Mais celui de captcha ne marche pas du tout

    Je vous montre mon code :

    captcha.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
    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
    <?php
    session_start();
    if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
     
    function getCode($length) {
    	$chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
    	$rand_str = '';
    	for ($i=0; $i<$length; $i++) {
    		$rand_str .= $chars{ mt_rand( 0, strlen($chars)-1 ) };
    	}
    	return $rand_str;
    }
     
     
    $theCode = getCode(5);
     
    $_SESSION['captcha'] = md5($theCode);
     
    $char1 = substr($theCode,0,1);
    $char2 = substr($theCode,1,1);
    $char3 = substr($theCode,2,1);
    $char4 = substr($theCode,3,1);
    $char5 = substr($theCode,4,1);
     
     
    $fonts = glob('fonts/*.ttf');
     
     
    $image = imagecreatefrompng('captcha.png');
     
     
    $colors=array (	imagecolorallocate($image, 131,154,255),
    				imagecolorallocate($image, 89,186,255),
    				imagecolorallocate($image, 155,190,214),
    				imagecolorallocate($image, 255,128,234),
    				imagecolorallocate($image, 255,123,123) );
     
     
    function random($tab) {
    	return $tab[array_rand($tab)];
    }
     
     
    imagettftext($image, 28, -10, 0, 37, random($colors), ABSPATH .'/'. random($fonts), $char1);
    imagettftext($image, 28, 20, 37, 37, random($colors), ABSPATH .'/'. random($fonts), $char2);
    imagettftext($image, 28, -35, 55, 37, random($colors), ABSPATH .'/'. random($fonts), $char3);
    imagettftext($image, 28, 25, 100, 37, random($colors), ABSPATH .'/'. random($fonts), $char4);
    imagettftext($image, 28, -15, 120, 37, random($colors), ABSPATH .'/'. random($fonts), $char5);
    header('Content-Type: image/png');
    imagepng($image);
    imagedestroy($image);
    ?>
    Dans mon html :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php session_start(); ?><TR>
    	<TD><img src="captcha.php" alt="Captcha" id="captcha" /> :</TD>
    	<TD>
     
    	<a style="cursor:pointer" onclick="document.images.captcha.src='captcha.php?id='+Math.round(Math.random(0)*1000)+1">Recharger l'image</a>
    		<p>
    			<input name="userCode" id="userCode" type="text" autocomplete="off" />
     
    		</p>
    </TR>
    Après dans la page d'envoi j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $test = $_POST['userCode'];
    $test2 = $_REQUEST['userCode'];
    $test3 = $_SESSION['captcha'];
    $userCode  = strtoupper($_POST['userCode']);
    ?>
     
    Oubli de mot de passe serveur Like: <?php echo $test; ?> <?php echo $test2; ?> <?php echo $test3; ?>
    Prenons un exemple, sans prendre compte de l'image, dans la case du captcha je met : HYOP

    Sa me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Oubli de mot de passe serveur Like: HYOP HYOP
    Alors que je devrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Oubli de mot de passe serveur Like: HYOP HYOP "La ce qui est écrit sur le captcha encoder en md5"
    Si quelqu'un pourrais m'éclairais
    Merci d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas de session_start() sur le dernier fichier.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu n'as pas de session_start() sur le dernier fichier.
    Si si, il se présente comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    session_start();
    mysql_connect('***');
    mysql_select_db("***");
    ?>
    Comme je l'ai déjà, j'utilise déjà un système de login qui marche très bien en session donc j'ai session_start() sur toute les pages

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as contrôlé ce que contenait $_SESSION a chaque étape ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Toutes mes autre session marche très bien, c'est ça que je comprend.
    J'ai essayer de mettre des echo partout, le $_SESSION['captcha'] existe nul part il veux pas se créer

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu veux dire qu'apres le img src non plus tu n'as rien dans la session ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Oui, je viens d'ajouter une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <TR>
    <TD>Test $_SESSION['captcha'] = <?php echo $_SESSION['captcha']; ?></TD>
    <TD>
    </TD>
    </TR>
    http://revolutionmt2.com/oublilike.php

    Je comprend pas trop

    Edit : Maintenant sa marche ç_ç je vais tester l'envoie du formulaire
    Edit2 : Donc voilà, le truc c'est que la session se reporte pas sur l'envoie du formulaire

  8. #8
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Citation Envoyé par Clad3815 Voir le message

    ====>>> Dans mon html :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php session_start(); ?><TR>
    	<TD><img src="captcha.php" alt="Captcha" id="captcha" /> :</TD>
    	<TD>
     
    	<a style="cursor:pointer" onclick="document.images.captcha.src='captcha.php?id='+Math.round(Math.random(0)*1000)+1">Recharger l'image</a>
    		<p>
    			<input name="userCode" id="userCode" type="text" autocomplete="off" />
     
    		</p>
    </TR>
    Salut

    Ce qui m'interpelle, c'est quand tu donnes le détail de tes différents fichiers, certains php, et d'autres html.

    Dans la cas ci-dessus, tu précises ( je suppose) qu'il s'agit d'un fichier comprenant l'extention html. ( ??)
    Enfin, je dis ça, j'en sais trop rien, à toi de nous confirmer.

    Mais si c'est le cas, un fichier qui comprend du php doit nécessairement avoir une extention php, même si c'est un mélange html/php.

    Juste une piste...aprés (?), faudra en explorer une autre.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Merci de t'intéresser à mon problème, il porte bien le format php.
    Je parler de la structure xHTML
    La session ne se reporte pas sur la page d'après :/

  10. #10
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Slt

    Mais où il est ton formulaire ?
    De quelle façon tu envoies les variables au navigateur.
    Franchement, je pige pas ton code.
    Citation Envoyé par Clad3815 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php session_start(); ?><TR>
    	<TD><img src="captcha.php" alt="Captcha" id="captcha" /> :</TD>
    	<TD>
     
    	<a style="cursor:pointer" onclick="document.images.captcha.src='captcha.php?id='+Math.round(Math.random(0)*1000)+1">Recharger l'image</a>
    		<p>
    			<input name="userCode" id="userCode" type="text" autocomplete="off" />
     
    		</p>
    </TR>

  11. #11
    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
    Citation Envoyé par alain31tl
    Franchement, je pige pas ton code.
    Pareil, je ne pige pas non plus.

    Ceci ne va pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php session_start(); ?><TR>
    S'il y a un <tr> juste après le session_start(), ça suppose qu'il y a un <table> avant.
    Or, la fonction session_start() DOIT être appelée avant le moindre echo, avant le moindre renvoi HTML.
    Faut le faire avant le <DOCTYPE ...><html>etc ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    session_start();
    ?>
     
    <doctype ...>
    <html>
     
    <body>
    ... contenu de la page HTML
    </body>
    </html>
    Aussi, peut être a tu un souci au niveau du chemin des fonts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    define('ABSPATH', dirname(__FILE__) . '/');
    imagettftext($image, 28, -10, 0, 37, random($colors), ABSPATH .'/'. random($fonts), $char1);
    Il y a un slash de trop théoriquement.
    Soit il faut l'enlever du dirname().'/', soit du ABSPATH .'/'.


    Petite astuce en passant.
    Pour vérifier ,
    Pour pouvoir faire des echo dans une image dynamique, (comme un captcha) afin de débugger, de pister une éventuelle erreur, de même que si Php retourne une erreur, pouvoir l'afficher (à condition d'afficher le erreurs php. cf. display_errors du php.ini), pour cela, au lieu de créer une balise <img src="image_dynamique.php">, on peu la remplacer provisoirement (pour essai) une balise <iframe src="image_dynamique.php"></iframe>.
    Quand tout est ok, opérationnel, on remet sa balise <img>.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    J'ai couper le code, mon captcha marche très bien comme vous pouvez le voir ici : http://revolutionmt2.com/oublilike.php

    Mais la SESSION se reporte pas sur la page d'envoie (Session['captcha'])
    Comme vous pouvez voir sur la page j'ai aussi un système de connexion qui lui marche très bien

    J'avais eu une idée alternative, mettre une balise hidden avec un nom qui a rien à voir et un <?php echo $_SESSION['captcha']; ?> dans la value de ce hidden

    Mais j'ai pas penser que la session se charger avec l'image donc pas au début de page donc pour que la value s'affiche il faut rafraichir la page et sa met la SESSION d'avant, mais comme l'image change

    J'ai tout essayer et je ne comprend pas pourquoi la session ne se charge pas ...

    Sur la page : http://revolutionmt2.com/oublilike.php j'ai bien le session_start() et sur : http://revolutionmt2.com/oubliLike_envoie.php aussi

  13. #13
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,
    Le session_start est bien placé au tout début de ton code php?

    PS: si les erreurs PHP ne sont aps activées,active-les

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Sur la page : http://revolutionmt2.com/oublilike.php j'ai bien le session_start() et sur : http://revolutionmt2.com/oubliLike_envoie.php aussi
    Comme je l'avais dit ils sont bien présent, et aucune erreur php n'est présente :/

  15. #15
    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
    Pour éviter tous éléments perturbateurs, crée une nouvelle page, (genre essai_envoie.php) et pointe l'envoie du formulaire sur celle ci (provisoirement), et avec uniquement ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    session_start();
    print_r($_SESSION);
    echo '<br />';
    print_r($_POST);
    ?>
    Théoriquement, tu devrais récupérer la valeur du captcha, et celle saisie dans le champ texte, et les 2 devraient être identiques (à condition de bien saisir les caractères, ça va de soit).
    Il faut au moins valider ça, ce qui confirmerait qu'au moins 1 étape est bien réalisée.

    Autre point :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['captcha'] = md5($theCode);
    Donc la séquence est hachée en MD5.
    Du coup, lorsque tu récupère celle envoyée en POST, et au moment de la comparaison, as tu bien utiliser la fonction md5() aussi ?
    Sinon, il est normal que les valeurs ne soient pas les mêmes.

    J'avais eu une idée alternative, mettre une balise hidden avec un nom qui a rien à voir et un <?php echo $_SESSION['captcha']; ?> dans la value de ce hidden
    Non, et même surtout pas, tu risque de modifier la valeur du captcha, que sa valeur soit réactualisée, au bout, il y aura jamais une concordance entre sa valeur et celle affichée.
    En somme, il ne faut pas appeler 2 fois cette image.
    On pourrait récupérer sa valeur, mais pour ça le seule moyen serait d'exploiter de l'Ajax ou faire une requête Curl.
    Bref, oubli cette technique, tu risque de rendre les choses plus compliquées.

    Ceci dit, la session du captch n'est pas créé au moment où la personne reçois le contenu de la page HTML, mais après.
    C'est à dire que le serveur renvoie en 1er la page, le formulaire, et c'est ensuite (donc bien après) que le navigateur interprète le code HTML, voit qu'il y a une image à rechercher (le captcha), du coup, une nouvelle requête HTTP sera lancée vers le serveur pour enfin obtenir le contenu de cette image.
    Ici, les choses se passent en 2 temps, et non au même moment.
    Ce qui veux dire que le $_SESSION['captcha'] n'est pas encore créé dans cette page contact. Vouloir mettre sa valeur dans un champ hidden va générer une erreur, au mieux, rien obtenir.

Discussions similaires

  1. Perte de ma variable session (cas d'un captcha)
    Par m_jaz3 dans le forum Langage
    Réponses: 3
    Dernier message: 29/01/2013, 11h25
  2. Problème variable SESSION captcha
    Par victoires dans le forum Langage
    Réponses: 0
    Dernier message: 16/11/2012, 10h20
  3. [PHP 5.3] fonction captcha et url dans une variable session
    Par Echap dans le forum Langage
    Réponses: 0
    Dernier message: 05/10/2012, 14h37
  4. Créer un CAPTCHA sans devoir ouvrir une session
    Par Thordax dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2011, 19h04
  5. Captcha, redirection et sessions
    Par ceweb dans le forum Langage
    Réponses: 7
    Dernier message: 17/12/2008, 19h48

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