Bug avec cryptographp

Fermé
philippe39 Messages postés 3 Date d'inscription dimanche 10 janvier 2010 Statut Membre Dernière intervention 1 août 2010 - 1 août 2010 à 16:21
avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 - 1 août 2010 à 23:36
Bonjour,

Bonjour,

J'administre un petit site avec un livre d'or. depuis qq temps je suis envahi par les spam, j'ai donc tenté d'installer un captcha.

J'utilise une page test_utilisateur.php qui propose le captcha et une page insert_signature qui recueille le post.

1) quand l'utilisateur saisi un captcha erroné, il a le message d'erreur attendu

2) quand l'utilisateur saisi un captcha correct, le formulaire lui est bien proposé mais lorsqu'il le valide il a le message d'erreur correspondant à un mauvais captcha...

Je vous remercie d'avance pour vos réponses.

Page test_utilisateur.php :

<?php
$cryptinstall="./crypt/cryptographp.fct.php";
include $cryptinstall;
?>

<form action="insert_signature.php" method="post">
<table>
<tr><td><?php dsp_crypt(0,1); ?></td></tr>
<tr><td>Recopier le code:<input type="text" name="code"></td></tr>
<tr><td><input type="submit" name="submit" value="Envoyer"></td></tr>
</table>
</form>

Page insert_signature

<?php
$cryptinstall="./crypt/cryptographp.fct.php";
include $cryptinstall;
?>

<?php


if (chk_crypt($_POST['code']))
{
if (isset($_POST['go']) && $_POST['go']=='Signer') {

if ((isset($_POST['auteur'])) && (isset($_POST['email'])) && (isset($_POST['message']))) {
// si les 3 variables ne sont pas vides, et si l'adresse E-mail est valide, alors, et seulement dans ce cas, on fera notre insertion dans la base
if ((!empty($_POST['auteur'])) && (!empty($_POST['email'])) && (!empty($_POST['message']))) {
// on verifie le format de l'adresse E-mail saisie
$test_mail = eregi ('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)+$', $_POST['email']);
if ($test_mail) {
// on se connecte à notre base
$base = mysql_connect ('sql.clairvaux-location.fr', 'login', 'password');
mysql_select_db ('clairvaux_location_fr', $base);

// on prepare notre requête d'insertion des données
$sql = 'INSERT INTO livre_or VALUES("", "'.mysql_escape_string($_POST['auteur']).'", "'.mysql_escape_string($_POST['email']).'", "'.date("Y-m-d H:i:s").'", "'.mysql_escape_string($_POST['message']).'")';

// on lance la requête
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

// on ferme la connexion à la base de données
mysql_close();

// on envoi un mail au webmaster
mail("webmaster@neuf.fr","Nouveau message sur le livre d'or","Quelqu'un a posté un nouveau message sur le livre d'or");

// on redirige le visiteur vers l'accueil du livre d'or
header('location: livre_or.php');

// on termine le script courant
exit();
}
else {
$erreur = 'Votre adresse E-mail est invalide.';
}
}
else {
$erreur = 'Au moins un des champs est vide.';
}
}
else {
$erreur = 'Les variables nécessaires au script ne sont pas définies.';
}
}
// on entre dans le cas où l'un des trois (au moins) champs n'a pas été rempli ou si l'adresse E-mail n'a pas été validée (en particulier, lorsque le visiteur charge pour la première fois cette page, vu que les 3 champs sont vides, le formulaire s'affichera). On remarque également que l'on met la valeur de chaque champs dans le value (c'est cela qui fait que si le visiteur ne remplit pas entièrement le formulaire et qu'il clique sur "Signer", et bien lorsqu'il sera redirigé vers le formulaire, ce qu'il aura déjà saisi sera conservé
?>

<html>

<title>.: Location de vacances Clairvaux Les Lacs - Situation :.</title>
<meta NAME="Location de vacances Clairvaux Les Lacs" CONTENT="Votre description">
<meta NAME="keywords" CONTENT="Vos mots clefs">
<meta http-equiv="Content-Language" content="fr">
<meta NAME="author" CONTENT="Vous">
<meta NAME="rating" CONTENT="general">
<meta NAME="classification" CONTENT="Tout public">
<meta NAME="copyright" CONTENT="Infos copyright">
<meta NAME="expires" CONTENT="never">
<meta NAME="rating" CONTENT="general">
<meta NAME="revisit-after" CONTENT="31 days">
<meta NAME="Robots" CONTENT="all | follow | index">
<meta NAME="Reply to" CONTENT="mailto:adesse email">
<meta NAME="publisher" CONTENT="Vous">
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<link href="style.css" TYPE="text/css" rel="stylesheet">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="imagetoolbar" content="no">
<meta content="TRUE" name="MSSmartTagsPreventParsing">
</head>

<body background="page_bg.jpg" topmargin="0" leftmargin="0">

<div align="center">

<?php include("bandeau.php"); ?> <!-- Insertion du bandeau -->

<table border="0">


<tr height="50"><td><B>Merci de nous laisser votre avis sur les vacances que vous avez passées dans notre location<td></tr>

<tr><td>
<form action="insert_signature.php" method="post">
<table>
<tr><td>
<span class="gras">Auteur :</span>
</td><td>
<input type="text" name="auteur" maxlength="30" size="50" value="<?php if (isset($_POST['auteur'])) echo htmlentities(trim($_POST['auteur'])); ?>">
</td></tr><tr><td>
<span class="gras">Adresse E-mail :</span>
</td><td>
<input type="text" name="email" maxlength="50" size="50" value="<?php if (isset($_POST['email'])) echo htmlentities(trim($_POST['email'])); ?>">
</td></tr><tr><td>
<span class="gras">Votre message :</span>
</td><td>
<textarea name="message" cols="50" rows="10"><?php if (isset($_POST['message'])) echo htmlentities(trim($_POST['message'])); ?></textarea>
</td></tr><tr><td><td align="right">
<input type="submit" name="go" value="Signer">
</td></tr></table>
</form>
<?php
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</TD>
</TR>
</TABLE>

<table><tr height="10"> <td> </td></tr></table>

<?php include("pied_page.php"); ?> <!-- Insertion du bandeau -->



</div>

</body>

</html>



<?php exit();}
else echo "Erreur";
?>









A voir également:

3 réponses

bg62 Messages postés 23658 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 20 novembre 2024 2 388
1 août 2010 à 18:28
aïe !!!
pourquoi te casser la t^te avec un tel code si tu n'arrives pas à l'installer, il y a bien plus simple et aussi efficace:
https://www.unesourisetmoi.info/pages/captchapage.php
ou:
https://www.commentcamarche.net/faq/19213-php-code-antispam-avec-chiffres-et-lettres-captcha
mais:
https://www.commentcamarche.net/faq/8250-les-captchas-sont-infaillibles-pour-bloquer-les-robots
:-)
0
LelLex Messages postés 1628 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 5 septembre 2012 112
1 août 2010 à 18:34
Tu as aussi un petit 3 + 2 = ? . ;)
0
bg62 Messages postés 23658 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 20 novembre 2024 2 388
1 août 2010 à 18:46
+10 pourquoi faire compliqué quand on peut faire simple ... de plus avec ce système souvent c'est peu lisible :-)
0
avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 504
1 août 2010 à 23:36
Salut.

Utilise la balise "code" de CCM quand tu colles des codes.
S'ils sont long, je pense qu'il est même préférable d'utiliser un pastebin (tiens, CCM devrait en proposer un, ça serait utile).

Pour ton problème, ce n'est pas un bug mais un problème au niveau de la logique de ton code.
Après un rapide coup d'oeil (je n'ai pas regardé trop longtemps, c'est illisible), je pense avoir trouvé le soucis : Lorsque l'utilisateur arrive sur la première page, le captcha est généré et le code à entrer et enregistré dans une variable de session. Lorsqu'on soumet le formulaire, on tombe sur la seconde page et la fonction chk_crypt() (qui vérifie si le code est bon) fait son boulot mais supprime la variable (pour, par exemple, éviter un renvoie du formulaire par actualisation). Donc forcément, lorsque l'utilisateur envoie le second formulaire, tu revérifies si le captcha entré est bon mais :
1) La variable de session n'existe plus
2) Idem pour $_POST['code']
0