Livre d'or Anti-Bots ! ==>Résolue est Bonne Année 2007 !

Petit nouveau ! | 3 Messages

31 déc. 2006, 21:47

Bonsoir, sur mon site, j'ai un problèmes de bot qui pollue mon livre d'or,
ainsi, j'ai voulus créer mon propre code de vérification. Le visiteur doit entrez le code, qui se trouvent sur l'image est validez. Si, le code entrer est bon le message est postez, s'il ne l'est pas le message n'est pas postez!

La page de mon livre d'or :
<?php

// Démarage de la session PHP4
// Il faut toujours déclarer la session avant le premier envoi de donnés.
// Par sécurité, on le fait tout au début.

session_start();

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Livre d'or</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        form, .pages
        {
            text-align:center;
        }
        </style>
    </head>
   
    <body>

    <form method="post" action="http://www.zone-dinogaia.omivu.net/test/bot/exemple.php">
    <p>Mon site vous plaît ? Laissez-moi un message !</p>
   
    <?php

// Si on a pas encore validé le formulaire, la variable POST "code" n'existe pas.
// On va donc écrire le formulaire

// Vous pouvez voir ceci dans le code du formulaire "<img src="image.php" />"
// En réalité, on appelle la page qui est une image mais qui va également génerer le code.

if( !isset($_POST['code']) ) {

        echo '<form id="form1" name="form1" method="post" action=""> 
        Pseudo : <input type="text" name="champs_1_exemple" /><br />
        Message :<br />
        <textarea name="message" rows="8" cols="35"></textarea> <br />
 
        <p><img src="image.php" /></p>
 
        <p>Entrez votre code de vérfication
        <input type="text" name="code" /></p>
       
        <p><input type="submit" name="Submit" value="Envoyer" /></p>

        </form>';


}

// Autrement, la variable CODE existe

else {

        // On va la vérifier avec celle générée par l'image (image.php)
        // On utilise la fct "strtolower" qui renvoie l'entree du formulaire en minuscule par sécurité
        if( strtolower($_POST['code']) == $_SESSION['enregistrement_du_code'] ) {
       
                echo '<p>ok, pas de prob, le code est bon</p>';
                // Action autorisée par la validation du code
       
        }
       
        // Ici, on va afficher ce qu'on veut pour indiquer que ca n'a pas été
        else echo '<p>Désolé, le code n\'est pas bon, retournez sur la page précédente.</p>';

}




?>

<p class="pages">
<?php
mysql_connect("******", "******", "******");
mysql_select_db("******");

// --------------- Etape 1 -----------------
// Si un message est envoyé, on l'enregistre
// -----------------------------------------

if (isset($_POST['pseudo']) AND isset($_POST['message']))
{
   
    $pseudo = htmlentities($_POST['pseudo'], ENT_QUOTES); // On utilise htmlentities par mesure de sécurité
       
    $message = htmlentities($_POST['message'], ENT_QUOTES); // De même pour le message
    $message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br />
   
    // On peut enfin enregistrer :o)
    mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')");
}

// --------------- Etape 2 -----------------
// On écrit les liens vers chacune des pages
// -----------------------------------------

// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)

// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];

// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);

// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}

?>

</p>

<?php
// --------------- Etape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------

if (isset($_GET['page']))
{
    $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
    $page = 1; // On se met sur la page 1 (par défaut)
}

// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;

$reponse = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);

while ($donnees = mysql_fetch_array($reponse))
{
    echo '<p><strong>' . $donnees['pseudo'] . '</strong> a écrit :<br />' . $donnees['message'] . '</p>';
}

mysql_close(); // On n'oublie pas de fermer la connexion à MySQL ;o)
?>

</body>
</html>
La page de l'image :
<?php
session_start();

               

                header ("Content-type: image/png");

                // Nombre de caractère du code
                $nb_caract = 8;

                // Emplacement des images
                $pathimg = './code/';

                // Taille de l'image de brouillage
                $taille_code['x'] = 40;
                $taille_code['y'] = 320;

                // Taille des lettres
                $taille_lettre['x'] = 32;
                $taille_lettre['y'] = 45;

                $im = imageCreate ($nb_caract*$taille_lettre['x'], $taille_lettre['y']);
                $couleur_fond = ImageColorAllocate ($im, 219, 219, 219);

                $pass = "";
                $chaine = 'abcdefghijklmnopqrstuvwxyz0123456789';

                for($ct=0; $ct<$nb_caract; $ct++) $pass .= $chaine{mt_rand()%strlen($chaine)};

                for($i=0;$i<$nb_caract;$i++) {

                        $imc = imagecreatefrompng($pathimg.$pass{$i}.'.png');
                        imagecopy ($im, $imc,$i*$taille_lettre['x'] ,mt_rand(-4, 4) ,mt_rand(-1, 1) ,0, $taille_lettre['x'], $taille_lettre['y']);

                }

                $imc = imagecreatefrompng($pathimg.'code.png');

                for($i=0;$i<$nb_caract;$i++) imagecopy ($im, $imc,$i*$taille_lettre['x'] ,0 ,mt_rand(0, $taille_code['x']-$taille_lettre['x']) ,mt_rand(0, $taille_code['y']-$taille_lettre['y']) , $taille_lettre['x'], $taille_lettre['y']);

                imagePng ($im);


$_SESSION['enregistrement_du_code'] = $pass;

?>
Le problème, c'est que le code soit bon où mauvais, sa affiche quand même le message :x
Comment y remediez... :?:

Merci ! :P
Modifié en dernier par Moxostoma le 02 janv. 2007, 17:14, modifié 1 fois.

ViPHP
ViPHP | 1961 Messages

31 déc. 2006, 22:03

Bonjour,

Je ne suis pas sur que la structure de ta page soit correcte.

Essaie de voir le code XHTLM généré, je crois que l'une des "form" n'est pas fermée.

Si elle est fermée, dans ce cas tu mets une form dans une form == interdit.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 991 Messages

01 janv. 2007, 12:15

Moi je vois une autre erreur en effet php lit le code uniquement jusqu'a ce que on lui dise de s'arreter par ?> ou exit(); ici lorsque tu traite la verification tu ne lui dit pas de s'arreter ainsi moi je verrai :
else 
{
echo '<p>Désolé, le code n\'est pas bon, retournez sur la page précédente.</p>';
exit();
}
Ainsi le code situer plus bas ne sera pas afficher ...

Ou encor si tu ne veut pas arrete completement l affichage de ta page je te conseile ceci :
if( strtolower($_POST['code']) == $_SESSION['enregistrement_du_code'] ) {
       
                echo '<p>ok, pas de prob, le code est bon</p>';
                $post_verfication = TRUE;
                // Action autorisée par la validation du code
       
        }
       
        // Ici, on va afficher ce qu'on veut pour indiquer que ca n'a pas été
        else echo '<p>Désolé, le code n\'est pas bon, retournez sur la page précédente.</p>';

} 

Puis ensuite
if (isset($_POST['pseudo']) AND isset($_POST['message']) AND $post_verification)
{
    
DevOps, Symfony4, Hoa

Invité
Invité n'ayant pas de compte PHPfrance

02 janv. 2007, 17:12

J'ai tout bidouille mon code est sa est le code marche impec ;-)
Merci ! :o

Petit nouveau ! | 3 Messages

02 janv. 2007, 17:13

J'ai oublié de me connectez ^^ :lol: