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 :

CAPTCHA images


Sujet :

Langage PHP

  1. #1
    Membre extrêmement actif Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Par défaut CAPTCHA images
    Bonjour

    j'essaye de créer un capchca basé sur la vision d'une image choisit aléatoirement. Dans un premier temps je créé mon formulaire est le nombre aléatoire. (form.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
     
    <?php
    //je créé mon nombre alétoire parmis mes 4 images
    function random($car) {
    $string = "";
    $chaine = "1234";
    srand((double)microtime()*1000000);
    for($i=0; $i<$car; $i++) {
    $string .= $chaine[rand()%strlen($chaine)];
    }
    return $string;
    }
     
    $chaine = random(1); ?>
     
     
    <form action="record_form.php?chaine=<?php echo $chaine; ?>" method="post">
    <textarea name="message" cols="" rows=""></textarea><br />
    <img src="/essence/capchca_img/<?php echo $chaine; ?>.gif" /> Que voyez-vous? <input name="id" type="text" maxlength="20" /><br />
    <input name="bouton" type="submit" />
    </form>
    dans un deuxième temps je vérifie le formulaire record_form.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
     
    <?php
    //je récupère les variables de chaine.php
    $message = $_POST["message"];
    $chaine = $_POST["chaine"];
    $id = $_POST["id"];
     
    		//je me connecte et je sélectionne ma base
    		$db = mysql_connect('localhost', 'root', ''); 
    		mysql_select_db('capchca',$db);
     
    		//ma requête
    		$sql = "SELECT id FROM data where img = '$id'";
     
    		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
     
    		$data = mysql_fetch_assoc($req);
     
    		// je vérifie la concordance de chaine et d'id dans ma base mysql
    		if($data['id'] != $id) { 
    		echo 'mauvais';
        	exit;
      		}
     
    		// Si ça passe j'enregistre le message dans ma table
    		else {
    		$recording_message = "INSERT INTO message (texte) VALUES ('$message')";
    		mysql_query($recording_message) or die('eh merde dans l\'enregistrement');
    		echo 'Le message est dans la boite';
    		mysql_close();
    		}
    ?>
    Le problème (sinon ça ne serait pas drôle ... ) c'est que record_form.php ne trouve pas $chaine . Je pense que mon problème vient de form.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <form action="record_form.php?chaine=<?php echo $chaine; ?>"
    Pourtant , j'ai vu le conseil de Kerod, qui fait la même chose

    Citation Envoyé par Kerod Voir le message
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="authentifie.php?log=<?php echo $login; ?>">....</form>
    sinon j'ai trouvé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <form method="post" action="record_form.php?">
    <input type="hidden" name="dir" value="<? echo $chaine; ?>" />
    </form>

    Qu'en pensez-vous? merci pour vos conseils

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    $chaine étant transmis dans l'URL, il faut y accéder par $_GET['chaine'] et non pas $_POST['chaine']

    PS : transmettre le captcha dans une variable visible c'est bof :s utilise plutot les $_SESSION

  3. #3
    Membre extrêmement actif Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Par défaut
    Citation Envoyé par darkstar123456 Voir le message
    $chaine étant transmis dans l'URL, il faut y accéder par $_GET['chaine'] et non pas $_POST['chaine']

    PS : transmettre le captcha dans une variable visible c'est bof :s utilise plutot les $_SESSION
    heu ça ne marche pas plus avec get ... moi qui voulais éviter les sessions ...

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    baaah faut voir ce que t'as testé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form method="post" action="record_form.php?">
    <input type="hidden" name="dir" value="<? echo $chaine; ?>" />
    </form>
    Déjà ça tel quel ça renvera rien du tout car pas de submit....

    Et sinon de écrit de cette façon, (en rajoutant un submit) il faudra tester $_POST['dir']

    Donc tant que tu n'aurais pas montré un bout de code complet, difficile de t'aider... déjà est-ce que $chaine vaut quelque chose dans form.php ?

    PS : Les sessions c'est plus facile qu'on ne le pense...

  5. #5
    Membre extrêmement actif Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Par défaut
    Citation Envoyé par darkstar123456 Voir le message

    PS : Les sessions c'est plus facile qu'on ne le pense...
    heu pas sur ....

  6. #6
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Code form.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    // session_start doit toujours être utilisé avant le moindre affichage (un espace blanc et c'est mort !)
    session_start(); // a'y'est t'as une session ^^
     
    $_SESSION['captcha'] = ta_fonction_qui_retourne_un_captcha();
    /* reste du code avec le formulaire ici */

    Code record_form.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    session_start(); // important il faut relancer la session et récupérer les infos
    /**** traitement du formulaire ****/
    // Test du captcha
    if( empty($_POST['captcha'])) {
         echo "veuillez écrire le code CAPTCHA";
    } else {
         if ($_POST['captcha'] != $_SESSION['captcha']) { // Vérification du captcha, $_SESSION['captcha']
              echo "CAPTCHA incorrect";
         }
    }
    ?>

  7. #7
    Membre extrêmement actif Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Par défaut
    J'ai modifié mon code : chaine.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    <form action="record_form.php" method="post">
      <p>
        <input type="hidden" name="chaine" value="<?php echo $chaine; ?>" />
        <textarea name="message" cols="" rows=""></textarea>
        <br />
    ...
    et record_form

    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
     
    //je récupère les variables de chaine.php
    $message = $_POST["message"];
    $chaine = $_POST["chaine"];
    $id = $_POST["id"];
     
    //pas deux fois le même message
    $db_verif = mysql_connect('localhost', 'root', ''); 
    mysql_select_db('capchca',$db_verif);
    $sql_verif = "SELECT texte FROM message";
    $req_verif = mysql_query($sql_verif) or die('Erreur SQL !<br />'.$sql_verif.'<br />'.mysql_error()); 
    $data_verif = mysql_fetch_assoc($req_verif);
    if($data_verif ['texte'] == $message) {echo 'pas possible'; exit;}
     
    else {
     
    //je vérifie mon formulaire ( heu, il doit y avoir mieux)
    if (empty ($chaine)){echo 'pas question'; exit;}
    	else {
    		if(empty ($message)){echo 'pas de message'; exit;}
    		else {
    			if(empty ($id)){echo 'pas question'; exit;}
    				else {
     
    						//je me connecte et je sélectionne ma base
     
    ...
    là ça fonctionne avec ces améliorations. Par contre, quand l'utilisateur à tout bien envoyé ses infos et qu'il atterrit sur record_form, il n'a plus qu'a réactualiser la page pour renvoyer la même chose. Une solution?
    Es ce que unset($chaine, $message, $id); après l'enregistrement du message suffirait?

    Citation Envoyé par darkstar123456 Voir le message
    $chaine étant transmis dans l'URL, il faut y accéder par $_GET['chaine'] et non pas $_POST['chaine']

    PS : transmettre le captcha dans une variable visible c'est bof :s utilise plutot les $_SESSION
    heu, les sessions : c'est pas que je veux pas, c'est que ça me réussit pas ...

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut

    Rediriges la page avec la même page avec header.

  9. #9
    Membre extrêmement actif Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Par défaut
    Citation Envoyé par andry.aime Voir le message

    Rediriges la page avec la même page avec header.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    header('Location: http://www.monsite.be/record_form');
    Je le place après l'enregistrement du message? Non par ceque que ça me fais penser en En-têtes HTTP, mais je pense que c'est différent ....

  10. #10
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par ledisciple Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    header('Location: http://www.monsite.be/record_form');
    Je le place après l'enregistrement du message? Non par ceque que ça me fais penser en En-têtes HTTP, mais je pense que c'est différent ....
    De toute façon, si tu refuses de passer par un cookies ou une session, tu es obligé de révéler dans ton FORM un input hidden avec le code même s'il sagit du nom d'un fichier ;-)

  11. #11
    Membre extrêmement actif Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Par défaut nouvel essai
    j'espère que j'ai bon maintenant ...

    chaine.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
     
    <?php
    session_start(); // Création de la session
    ?>
    <?php
    //je créé mon nombre alétoire parmis mes 4 images
    function random($car) {
    $string = "";
    $chaine = "1234";
    srand((double)microtime()*1000000);
    for($i=0; $i<$car; $i++) {
    $string .= $chaine[rand()%strlen($chaine)];
    }
    return $string;
    }
    $chaine = random(1);
     
    //eh hop en session
    $_SESSION['capchca'] = $chaine;
    ?>
     
     
    <form action="record_form.php" method="post">
      <p>
        <textarea name="message" cols="" rows=""></textarea>
        <br />
        <img src="/essence/capchca_img/<?php echo $chaine; ?>.gif" /> Que voyez-vous? 
        <input name="id" type="text" maxlength="20" />
      </p>
      <p>
        <input type="submit" name="Submit" value="Envoyer" />
        <br />
        </p>
    </form>
    et record_form

    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 
    // là, je récupère mon numeo de fichier pour réassembler les deux $chaine
    session_start();
    if (isset($_SESSION['capchca']))
    {
     
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Document sans titre</title>
    </head>
     
    <body>
    <?php
    //je récupère les variables de chaine.php
    $message = $_POST["message"];
    $id = $_POST["id"];
    	//dont ma session
    	$chaine= $_SESSION['capchca'];
     
    //pas deux fois le même message
    $db_verif = mysql_connect('localhost', 'root', ''); 
    mysql_select_db('capchca',$db_verif);
    $sql_verif = "SELECT texte FROM message";
    $req_verif = mysql_query($sql_verif) or die('Erreur SQL !<br />'.$sql_verif.'<br />'.mysql_error()); 
    $data_verif = mysql_fetch_assoc($req_verif);
    if($data_verif ['texte'] == $message) {echo 'pas possible'; exit;}
     
    else {
     
    //je vérifie mon formulaire ( heu, il doit y avoir mieux)
    if(empty ($chaine)) {echo 'empty captcha'; exit;}
    	else {
    		if(empty ($message)){echo 'pas de message'; exit;}
    		else {
    			if(empty ($id)){echo 'empty id'; exit;}
    				else {
     
    						//je me connecte et je sélectionne ma base
    						$db = mysql_connect('localhost', 'root', ''); 
    						mysql_select_db('capchca',$db);
     
    						//ma requête
    						$sql = "SELECT id FROM data where img = '$chaine'";
     
    						$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
     
    						$data = mysql_fetch_assoc($req);
     
    						// je vérifie la concordance de chaine et d'id dans ma base mysql et j'enregistre
    						if($data['id'] == $id) { 
    						$recording_message = "INSERT INTO message (texte) VALUES ('$message')";
    						mysql_query($recording_message) or die('eh merde dans l\'enregistrement');
    						echo 'Le message est dans la boite';
    						mysql_close();
    						}
     
    						// là ça passe pas
    						else {
    						echo 'mauvais';
    						exit;
    						}
    					}
    				}
    			}
    		}
     
    // là c'est pour remercier developpez.com et tout le monde et le super tuto de Guillaume Rossolini @ http://g-rossolini.developpez.com/tutoriels/php/cours/
    $_SESSION = array();
     
    // là, c'est de la part de andry-aime
    header('Location: /autrepart.php'); // faut mettre le chemin absolu
    }
    ?>
    </body>
    </html>
    Maintenant je vaisintégrer le conseil suivant :

    Citation Envoyé par FoxLeRenard Voir le message
    Alors le top imbatable est de présenter aux gens une image
    en y incrustant les images faites a la main des lettres et chiffres.
    c'est donc impossible de casser ça par un robot !!
    ça devrait plus être trop compliqué en faisant passer les chiffres et les lettres par les sessions ...

    merci à tous

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

Discussions similaires

  1. Zend Captcha Image
    Par m4riachi dans le forum Zend
    Réponses: 1
    Dernier message: 02/12/2010, 19h05
  2. Rafraîchir captcha à partir d'une image
    Par beji15 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/04/2008, 00h09
  3. Comment créer un captcha sans des images TTF
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2007, 14h04
  4. [ImageMagick] Captcha crytographp image toute noire
    Par vodasan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/02/2007, 07h35
  5. Génération d'image de sécurité (captcha) et système alternatif
    Par eric41 dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 02/05/2006, 12h24

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