par
Moxostoma » 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

Comment y remediez...
Merci !

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]
<?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>[/php]
La page de l'image :
[php]
<?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;
?>[/php]
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