[PHP] Vérification captcha

Résolu/Fermé
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 - 16 déc. 2009 à 21:19
 le père - 19 déc. 2009 à 10:00
Bonjour,

Bonjour,

Je me demande comment vérifier si les chiffres entrés dans le champ sont valides (par rapport au captcha).
Dans mon script de création du captcha, j'ai ceci (ce n'est qu'une partie de mon script, pensant le reste inutile ) :
<?php
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$code = '';
while (strlen($code) != 6) 
{
 $code.= $liste [rand (0,34)];
}
$_SESSION['code'] = $code; 
?>


-> J'ai essayé avec if( $code = $_POST['verif'] ) et if( $code = $_POST['verif'] ), mais sans cuccès :(



Au passage, pourquoi le cookie 'mail' ne s'affiche pas dans mon champ ?! :
<?php
$cookie_expire = time() + 01*15*60; 
if( isset($_POST['mail']) ) 
{
 setcookie('mail', $_POST['mail'], $cookie_expire);
}
[...]
<input type="text" name="mail" value="<?php echo $_COOKIE['mail']; ?>" />
?>


Merci à vous :)
A voir également:

7 réponses

Bonjour

J'ai essayé avec if( $code = $_POST['verif'] ) et if( $code = $_POST['verif'] )
J'ai beau relire, j'ai l'impression que c'est deux fois la même chose.
Plusieurs remarques : la comparaison, c'est avec deux = :if( $code == $_POST['verif'] ). D'autre part, j'espère que quand tu fais ta comparaison, c'est bien avec la captcha affiché, (et donc généré lors de l'appel précédent) et pas avec un nouveau captcha tiré au sort. Comme on ne voit pas le reste du script, je le crains.

Pour ton cookie, c'est peut-être simplement qu'il est vide. As-tu essayé de le remplacer par$_POST['mail'] ?
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
17 déc. 2009 à 17:25
"J'ai essayé avec if( $code = $_POST['verif'] ) et if( $code = $_POST['verif'] )
J'ai beau relire, j'ai l'impression que c'est deux fois la même chose.
"
-> C'est bien 2 fois la même chose, désolé :) Je voulais dire avec if( $code == $_POST['verif'] ) comme tu me l'as indiqué...

"D'autre part, j'espère que quand tu fais ta comparaison, c'est bien avec la captcha affiché, (et donc généré lors de l'appel précédent) et pas avec un nouveau captcha tiré au sort."
-> Ah oui, j'avais pas pensé à ça :s . Merci de me l'avoir signalé.

=> J'ai donc pensé astucieux de faire le script ci-dessous mais ça ne créér pas de cookie ?!
if( !isset($_COOKIE['captcha']) ) 
{
 setcookie('captcha', $code, $cookie_expire);
}
(...)
if( $_POST['verif'] == $_COOKIE['captcha'] ) 
{
 captcha bien écrit t'es pas un robot c cool c beau etc etc.
}





"Pour ton cookie, c'est peut-être simplement qu'il est vide"
-> Pourtant, dans la fenêtre des cookies (de Fx), j'ai bien ma valeur de variable de session (avec %40 au lieu de @). J'ai bien sûr essayé avec $_POST['mail'] et là ça s'affiche o0 .
Comme le @ est remplacé par %40, j'ai écrit cela : html_entity_decode($_COOKIE['captcha']) ... je sais pas si c'est nécessaire ?
0
Pas possible de conclure, on ne voit que des petits morceaux de ton script sans savoir comment ils s'enchaînent.
Pour ce qui est du html_entity_decode, il est complètement inadapté : %40 n'est pas une entité html !
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
17 déc. 2009 à 19:05
Ok ok, j'enlève illico presto mon html_entity_decode... mais par quoi le remplacer alors ?


Et voici mon script (enfin c'est pas encore toute la page mais ça devrait faire l'affaire) :
<?php
session_start();
$cookie_expire = time() + 01*15*60; 
if( isset($_POST['objet']) ) 
{
 setcookie('objet', $_POST['objet'], $cookie_expire);
}
if( isset($_POST['mail']) ) 
{
 setcookie('mail', $_POST['mail'], $cookie_expire);
}
if( !isset($_COOKIE['captcha']) )
{
 setcookie('captcha', $code, $cookie_expire);
}
?>

<?php // DÉFINITION DES VARIABLES 
$destinataire = '*@free.fr';
$nom = $_SESSION['nom']; 
$objet = $_COOKIE['objet'];
$mail = $_POST['mail'];
?>

<?php // CRÉATION DU MAIL :
if( isset($_POST['send']) )
{
 
 (...) // Sont définis ici les headers, les messages, etc
 
 if( $transfert != true )
 {
  if( preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $_POST['mail']) )
  {
   if( $_POST['verif'] == $_COOKIE['captcha'] )
   {
    // Envoi du mail
    mail(...)
    $transfert = true;
   }
   else
   {
    $offcaptcha = true; 
   }
  }
  else
  {
   $offmail = true;
  }
 }
 
}
?>

<!DOCTYPE ... >

<form method="post" action="w.formulaire_contact.php" >

<?php // STATUT DE L'ENVOI
if
( isset($_POST['send']) )
{ 
 
 if( $transfert == true )
 { ?>
  Merci <?php echo $_SESSION['nom']; ?>, ta demande a été envoyée avec succès ! <br />
  Je t'enverrai dans la semaine un mail de confirmation à <?php $_COOKIE['mail']); ?> <br />
  Tu peux m'envoyer un autre mail en sélectionnant un autre sujet ci-dessous 
 <?php }

 elseif( $offcaptcha == true )
 { ?>
  Erreur lors de la re-écriture du captcha : Mail non envoyé !
 <?php }
 
 elseif( $offmail == true )
 { ?>
  L'adresse mail <cite> <?php echo $_POST['mail']; ?> </cite> est invalide : Mail non envoyé !
 <?php }
 
}
?>

<span class="etape"> 1. Sélectionne le sujet du message puis clique sur Ok : </span> <br />
<select name="objet">
<option value="inscription" <?php if ( isset($_POST['objet']) AND ($_POST['objet'] == 'inscription') ){ ?> selected="selected" <?php } ?> >t'inscrire et bénéficier des nombreux avantages !</option>
<option value="password_oubli" <?php if ( isset($_POST['objet']) AND ($_POST['objet'] == 'password_oubli') ){ ?> selected="selected" <?php } ?> >se rappeler de son mot de passe ?</option>
<option ... > (...)
</select> <input type="submit" value="Ok" > <br />
</form>
<br/>

<form method="post" action="w.formulaire_contact.php" enctype="multipart/form-data" >
<span class="etape">2. Remplis le(s) champ(s) suivants :</span> <br />
<label for="mail">adresse mail :</label> <input type="text" name="mail" style="margin-left: 4.5%" value="<?php echo html_entity_decode($_COOKIE['mail']); ?>" /> 
<br />
<?php 

if( isset($_POST['objet']) )
{  

 //--------------------------Si client non identifié comme membre------------------------
 if( $_SESSION['nom'] == true )
 {
  
  if ($_POST['objet'] == 'password_change')
  { ?> 
   <label for="mdp_change">mot de passe désiré :</label> <input type="text" name="mdp_change" /> <br/>
  <?php }
 
  elseif ( $_POST['objet'] == ...
  
  (...)
  
  elseif
  (
     $_POST['objet'] == 'password_change' 
  OR ...
  (...)
  )
  { ?>
  <br/>
  <span class="etape">3. Recopie maintenant le captcha :</span>
  <img src="w.captcha.php" alt="captcha" style="margin-left: 2%; border: 1px solid grey" /> <input type="text" name="verif" size="10" maxlength="6" /> <br />
  <input name="send" type="submit" value="Envoyer !" style="margin-left: 2%"> <label for="send" style="color: blue"> Clique pour valider et envoyer ton message !</label>
  <?php }
  
  //----demande d'inscription mais déjà membre----
 elseif( $_POST['objet'] == 'inscription' OR $_POST['objet'] == 'password_oubli' ) 
 { ?>
  <p style="color: red; text-align: center"> Tu es déjà identifié avec un mot de passe en tant que membre ! </p>
 <?php }
  
 }
 //------------------------------------------------------------------------------------------------------
 
 //-----------------------------Si client non identifié comme membre---------------------------------
 elseif( $_SESSION['nom'] == false )
 {

  if( $_POST['objet'] == 'inscription' OR $_POST['objet'] == 'password_oubli' ) 
  { ?>
   <label for="nom">prénom et nom :</label> <input type="text" name="nom" /> <br />
   <br/>
   <span class="etape">3. Recopie maintenant le code de vérification ci-dessous :</span> <br />
   <img src="w.captcha.php" alt="captcha" style="margin-left: 2%; border: 1px solid gray" /> <input type="text" name="verif" size="10" maxlength="6" />
   <input name="send" type="submit" value="Envoyer !" style="margin-left: 5%"> <label for="send" style="color: blue"> Clique pour valider et envoyer ta demande !</label> <br />
  <?php }
  
  elseif 
  ( 
      $_POST['objet'] == 'password_change' 
   OR ...
   (...)
   ) 
  { ?>
    <p style="color: red; text-align: center" >
	Tu dois t'identifier en tant que membre pour pouvoir faire cela !
	</p>
   <?php }
  //----------------------------------------------------------------------------------------------------
 
 }
 ?>

</form>
<?php  
;} 
?>


NOTE :
. J'envisage d'améliorer la simplicité du formulaire pour le client, à savoir placer le captcha avec la liste déroulante et de n'afficher les champs du formulaire qu'après vérification du captcha.
-> Les robots sont-ils capables de sélectionner un champ d'une liste déroulante ?

Merci pour ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
par quoi le remplacer alors ? Par rien du tout. Tu n'as qu'à afficher la valeur de ton cookie dans ton script et tu verras qu'il y a bien un @ là où FF te montre %40.

Quant à la vérification que tu fais if( $_POST['verif'] == $_COOKIE['captcha'] )
je ne la comprends pas du tout. D'où sort ton $_COOKIE['captcha'] ??? Au tout début, il n'existe pas. Alors tu l'initialises avec une certaine variable $code, mais rien ne dit d'où elle vient, elle. Ce cookie ne devrait en toute logique être initialisé que dans w.captcha.php (c'est peut-être le cas d'ailleurs)
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
18 déc. 2009 à 12:25
Effectivement, j'initialisais mon cookie dans ma page de formulaire et non dans celle du captcha.
C'est maintenant corrigé :)

Mais on ne m'a pas répondu...
Les robots sont-ils capables de sélectionner un champ d'une liste déroulante ?
0
Mais on ne m'a pas répondu...
Je relis et je ne vois pas où tu as posé la question. Mais je suis peut-être mal réveillé.
Techniquement, c'est faisable. Et même très facile avec un formulaire connu. J'ignore si les robots réels le font.
0