Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

IMAGE CRYPTÉE DE PROTECTION POUR FORMULAIRE WEB


Information sur la source

Catégorie :Formulaires Niveau : Débutant Date de création : 22/06/2003 Date de mise à jour : 23/06/2003 23:06:51 Vu / téléchargé: 12 615 / 1 565

Note :
5,75 / 10 - par 8 personnes
5,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Permet d'éviter les requêtes automatisées, qui aboutissent à un ralentissement du serveur et à l'engorgement de la base de données
 

Source

  • MAJ 23/06/03
  • Suite à une remarque de Nova, voila le code source des fichiers ainsi que la méthode pour intégrer çà dans un formulaire existant. En téléhcargeant le zip, vous avez l'avantage d'avoir un exemple tout pret :D mais peut être plus difficile à réutiliser pour les débutants
  • Fichier crypt.php
  • ------------------------
  • <?
  • // -------------------------------------------------------
  • // Image cryptée de protection pour formulaire web
  • // -------------------------------------------------------
  • // Permet d'éviter les requêtes automatisées, qui
  • // aboutissent à un ralentissement du serveur et à
  • // l'engorgement de la base de données
  • // -------------------------------------------------------
  • // © 2003 - Mathieu Rey <matreypub@hotmail.com>
  • // -------------------------------------------------------
  • require("./functions.php");
  • // Si le numéro de session est indiqué
  • if ($session!=""){
  • // Connexion BDD
  • $db = mysql_connect($serveur_mysql, $login_mysql, $pass_mysql);
  • mysql_select_db($base_mysql,$db);
  • // Lancement de la requete
  • $query = mysql_query("SELECT * FROM $table_mysql WHERE session = '$session'");
  • $row = mysql_fetch_row($query);
  • // Si la session est effectivement valable
  • if ($row[2]!=""){
  • // Créer l'image avec le code
  • CreateImage($row[2]);
  • }
  • }
  • ?>
  • Fichier functions.php
  • ------------------------------
  • <?
  • // -------------------------------------------------------
  • // Image cryptée de protection pour formulaire web
  • // -------------------------------------------------------
  • // Permet d'éviter les requêtes automatisées, qui
  • // aboutissent à un ralentissement du serveur et à
  • // l'engorgement de la base de données
  • // -------------------------------------------------------
  • // © 2003 - Mathieu Rey <matreypub@hotmail.com>
  • // -------------------------------------------------------
  • # -------------INFOS DE CONNEXION A MYSQL------------- #
  • $serveur_mysql = "localhost";
  • $login_mysql = "root";
  • $pass_mysql = "";
  • $base_mysql = "test";
  • $table_mysql = "codes";
  • # ---------------------------------------------------- #
  • # ---------------DUMP DE LA TABLE MYSQL--------------- #
  • /*
  • CREATE TABLE codes (
  • id tinyint(4) NOT NULL auto_increment,
  • session text NOT NULL,
  • code text NOT NULL,
  • now text NOT NULL,
  • PRIMARY KEY (id,id)
  • ) TYPE=MyISAM;
  • */
  • # ---------------------------------------------------- #
  • # Crée un code suivant le sid #
  • function CreateSession($session){
  • // Création d'un code à 6 chiffres
  • $code = substr(md5(time().time()), 0, 6);
  • // Création d'un identifiant de temps
  • $now = time();
  • // Enregistrement dans la base de données
  • $db = mysql_connect($serveur_mysql, $login_mysql, $pass_mysql);
  • mysql_select_db($base_mysql,$db);
  • $query = mysql_query("INSERT INTO $table_mysql VALUES('','$session','$code','$now')");
  • }
  • # Génère un image contenant le code #
  • function CreateImage($code){
  • // Définition des dimensions
  • $img = imagecreate(72, 25);
  • // Défintion des couleurs
  • $bgc = imagecolorallocate($img, 255, 255, 255);
  • $black = imagecolorallocate($img, 0, 0, 0);
  • $gris = imagecolorallocate($img, 128, 128, 128);
  • // Remplissage du fond
  • imagefilledrectangle($img, 0, 0, 72, 25, $bgc);
  • // Ecriture du code (le premier 5 est la taille - de la police par défaut - la plus grande dans GD)
  • // Ca évite d'avoir à installer FreeType, librairie qui ajoute le support des polices TrueType
  • imagestring($img, 5, 12, 5, $code, $black);
  • // Ajout d'un bruit
  • for($i=0;$i<150;$i++) {
  • imagesetpixel($img, rand(0,72), rand(0,25), $gris);
  • }
  • // Crétion de l'entête
  • header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  • header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  • header("Cache-Control: no-store, no-cache, must-revalidate");
  • header("Cache-Control: post-check=0, pre-check=0", false);
  • header("Pragma: no-cache");
  • // Création de l'image (qualité 15% : très médiocre)
  • imagejpeg($img, '', 15);
  • imagedestroy($img);
  • }
  • ?>
  • A faire maintenant :
  • 1. Configurez le fichier "functions.php"
  • 2. Executez le dump dans MySQL
  • Puis...
  • A ajouter dans votre formulaire, au niveau de l'affichage des champs
  • --------------------------------------------------------------------------------------------------
  • require("./functions.php");
  • // Affichage code + formulaire
  • $session = md5(time());
  • $numero = CreateSession($session);
  • ?>
  • <table border="0" cellspacing=0 cellpadding=3 bgcolor="#FDF1D5">
  • <tr>
  • <td colspan="2" bgcolor="#87D118"><font size="2"
  • face="Verdana"><strong>Vérification d'authenticité</strong></font></td>
  • </tr>
  • <tr>
  • <td width="60%"><font size="2" face="Verdana">Pour
  • garantir la sécurité de notre base de données, nous
  • vous demandons de bien vouloir recopier le code (à
  • droite) dans la zone de texte.<br>
  • Ce code est une image qui ne peut être lue par une
  • machine. Cela permet d'éviter que des programmes
  • automatiques ne submergent le serveur par leurs requêtes.</font></td>
  • <td width="40%"><p align="center">
  • <input type=hidden name=sid value=<? echo $session; ?>><font size="2"
  • face="Verdana">Votre code est :<br>
  • <img src=crypt.php?session=<? echo $session; ?>></font></p>
  • <p align="center"><font size="2" face="Verdana">Tapez
  • votre code ici :<br>
  • <input type=text name=code>
  • </font></p>
  • </td>
  • </tr>
  • </table>
  • A ajouter dans votre formulaire, au niveau du traitement des données reçues
  • --------------------------------------------------------------------------------------------------------------
  • require("./functions.php");
  • // Validation du code
  • if ($sid=="" OR $code == ""){
  • // Manque des éléments
  • echo "<script language='JavaScript'>window.alert('Vous n\'avez pas rempli tous les champs !');history.go(-1);</script>";
  • exit();
  • }
  • // Connexion BDD
  • $db = mysql_connect($serveur_mysql, $login_mysql, $pass_mysql);
  • mysql_select_db($base_mysql,$db);
  • // Lancement requete
  • $query = mysql_query("SELECT * FROM $table_mysql WHERE session = '$sid'");
  • $row = mysql_fetch_row($query);
  • if ($row[2]=="" or $row[2]!=$code){
  • // Code non valide
  • echo "<script language='JavaScript'>window.alert('Code incorrect !');history.go(-1);</script>";
  • exit();
  • }else{
  • // Code valide
  • // -----------
  • // Bien sur, si le code est correct, remplacez le message d'information par
  • // la suite du traitement du formulaire.
  • echo "<script language='JavaScript'>window.alert('Code correct !');</script>";
  • }
  • A ajouter dans votre formulaire, au niveau du traitement des infos recues, après avoir effectué toutes les vérifications
  • -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • // Suppression
  • // -----------
  • // /!\ Ne supprimez l'enregistrement de la base de données que lorsque aucun erreur
  • // ne peut plus avoir lieu (car si une info manque et que le code a déjà été supprimé
  • // de la base, la revalidation du formulaire échouera)
  • $query = mysql_query("DELETE FROM $table_mysql WHERE session = '$sid'");
  • Voila !
  • Si vous avez un quelconque problème avec ce script, n'hésitez pas à le dire !
 MAJ 23/06/03
Suite à une remarque de Nova, voila le code source des fichiers ainsi que la méthode pour intégrer çà dans un formulaire existant. En téléhcargeant le zip, vous avez l'avantage d'avoir un exemple tout pret :D mais peut être plus difficile à réutiliser pour les débutants

Fichier crypt.php
------------------------

<?
// -------------------------------------------------------
// Image cryptée de protection pour formulaire web
// -------------------------------------------------------
// Permet d'éviter les requêtes automatisées, qui
// aboutissent à un ralentissement du serveur et à
// l'engorgement de la base de données
// -------------------------------------------------------
// © 2003 - Mathieu Rey <matreypub@hotmail.com>
// -------------------------------------------------------

require("./functions.php");

// Si le numéro de session est indiqué
if ($session!=""){
 // Connexion BDD
 $db = mysql_connect($serveur_mysql, $login_mysql, $pass_mysql);
 mysql_select_db($base_mysql,$db);
 // Lancement de la requete
 $query = mysql_query("SELECT * FROM $table_mysql WHERE session = '$session'");
 $row = mysql_fetch_row($query);
 // Si la session est effectivement valable
 if ($row[2]!=""){
  // Créer l'image avec le code
  CreateImage($row[2]);
 }
}
?>


Fichier functions.php
------------------------------

<?
// -------------------------------------------------------
// Image cryptée de protection pour formulaire web
// -------------------------------------------------------
// Permet d'éviter les requêtes automatisées, qui
// aboutissent à un ralentissement du serveur et à
// l'engorgement de la base de données
// -------------------------------------------------------
// © 2003 - Mathieu Rey <matreypub@hotmail.com>
// -------------------------------------------------------

# -------------INFOS DE CONNEXION A MYSQL------------- #
$serveur_mysql = "localhost";
$login_mysql = "root";
$pass_mysql = "";
$base_mysql = "test";
$table_mysql = "codes";
# ---------------------------------------------------- #

# ---------------DUMP DE LA TABLE MYSQL--------------- #
/*
CREATE TABLE codes (
  id tinyint(4) NOT NULL auto_increment,
  session text NOT NULL,
  code text NOT NULL,
  now text NOT NULL,
  PRIMARY KEY  (id,id)
) TYPE=MyISAM;
*/
# ---------------------------------------------------- #

# Crée un code suivant le sid #
function CreateSession($session){
 // Création d'un code à 6 chiffres
 $code = substr(md5(time().time()), 0, 6);
 // Création d'un identifiant de temps
 $now = time();
 // Enregistrement dans la base de données
 $db = mysql_connect($serveur_mysql, $login_mysql, $pass_mysql);
 mysql_select_db($base_mysql,$db);
 $query = mysql_query("INSERT INTO $table_mysql VALUES('','$session','$code','$now')");
}

# Génère un image contenant le code #
function CreateImage($code){
 // Définition des dimensions
 $img = imagecreate(72, 25);
 // Défintion des couleurs
 $bgc = imagecolorallocate($img, 255, 255, 255);
 $black = imagecolorallocate($img, 0, 0, 0);
 $gris = imagecolorallocate($img, 128, 128, 128);
 // Remplissage du fond
 imagefilledrectangle($img, 0, 0, 72, 25, $bgc);
 // Ecriture du code (le premier 5 est la taille - de la police par défaut - la plus grande dans GD)
 // Ca évite d'avoir à installer FreeType, librairie qui ajoute le support des polices TrueType
 imagestring($img, 5, 12, 5, $code, $black);
 // Ajout d'un bruit
 for($i=0;$i<150;$i++) {
  imagesetpixel($img, rand(0,72), rand(0,25), $gris);
 }
 // Crétion de l'entête
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
 header("Cache-Control: no-store, no-cache, must-revalidate"); 
 header("Cache-Control: post-check=0, pre-check=0", false);
 header("Pragma: no-cache");
 // Création de l'image (qualité 15% : très médiocre)
 imagejpeg($img, '', 15);
 imagedestroy($img);
}
?>

A faire maintenant :
 1. Configurez le fichier "functions.php"
 2. Executez le dump dans MySQL
Puis...

A ajouter dans votre formulaire, au niveau de l'affichage des champs
--------------------------------------------------------------------------------------------------

require("./functions.php");

// Affichage code + formulaire
$session = md5(time());
$numero = CreateSession($session);
?>
<table border="0" cellspacing=0 cellpadding=3 bgcolor="#FDF1D5">
<tr>
<td colspan="2" bgcolor="#87D118"><font size="2"
face="Verdana"><strong>Vérification d'authenticité</strong></font></td>
</tr>
<tr>
<td width="60%"><font size="2" face="Verdana">Pour
garantir la sécurité de notre base de données, nous
vous demandons de bien vouloir recopier le code (à
droite) dans la zone de texte.<br>
Ce code est une image qui ne peut être lue par une
machine. Cela permet d'éviter que des programmes
automatiques ne submergent le serveur par leurs requêtes.</font></td>
<td width="40%"><p align="center">
<input type=hidden name=sid value=<? echo $session; ?>><font size="2"
face="Verdana">Votre code est :<br>
<img src=crypt.php?session=<? echo $session; ?>></font></p>
<p align="center"><font size="2" face="Verdana">Tapez
votre code ici :<br>
<input type=text name=code>
</font></p>
</td>
</tr>
</table>


A ajouter dans votre formulaire, au niveau du traitement des données reçues
--------------------------------------------------------------------------------------------------------------

require("./functions.php");

// Validation du code
if ($sid=="" OR $code == ""){
 // Manque des éléments
 echo "<script language='JavaScript'>window.alert('Vous n\'avez pas rempli tous les champs !');history.go(-1);</script>";
 exit();
}
// Connexion BDD
$db = mysql_connect($serveur_mysql, $login_mysql, $pass_mysql);
mysql_select_db($base_mysql,$db);
// Lancement requete
$query = mysql_query("SELECT * FROM $table_mysql WHERE session = '$sid'");
$row = mysql_fetch_row($query);
if ($row[2]=="" or $row[2]!=$code){
 // Code non valide
 echo "<script language='JavaScript'>window.alert('Code incorrect !');history.go(-1);</script>";
 exit();
}else{
 // Code valide
 // -----------
 // Bien sur, si le code est correct, remplacez le message d'information par 
 // la suite du traitement du formulaire. 
 echo "<script language='JavaScript'>window.alert('Code correct !');</script>";
}


A ajouter dans votre formulaire, au niveau du traitement des infos recues, après avoir effectué toutes les vérifications
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

// Suppression
// -----------
// /!\ Ne supprimez l'enregistrement de la base de données que lorsque aucun erreur 
// ne peut plus avoir lieu (car si une info manque et que le code a déjà été supprimé 
// de la base, la revalidation du formulaire échouera)
$query = mysql_query("DELETE FROM $table_mysql WHERE session = '$sid'");

Voila !
Si vous avez un quelconque problème avec ce script, n'hésitez pas à le dire !

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de nova le 23/06/2003 12:13:11

salut

tres bien ce code, mais comme je debute, je souhaite l'intégrer à un formulaire déjà existant dans lequel je demande le nom, prenom et l'email  avec stockage de ces infos dans une bdd...

comment dois-je faire? et puis-je rassembler la table de ton script dans la mienne existante?

@++
Nova

signaler à un administrateur
Commentaire de Granola le 24/06/2003 09:24:30

Super ce script :)
Merci à toi j'en cherchais justement un :)

signaler à un administrateur
Commentaire de bricethenetman le 24/07/2003 18:38:42

Ce script a l'air super mais g juste une question. Est ce ke ya besoin de d'installer une librairie particuliere.

signaler à un administrateur
Commentaire de bricethenetman le 24/07/2003 18:41:54

Ce script a l'air super mais g juste une question. Est ce ke ya besoin de d'installer une librairie particuliere.

signaler à un administrateur
Commentaire de matrey le 25/07/2003 17:14:06

Alors, niveau librairies, il en faut une : GD.
Comme on génère du JPG "bas de gamme" (très compressé, n'importe quelle antique version de GD peut être utilisée. Depuis PHP 4....(chais plus la version :$), cette librairie est incluse dans PHP, sinon elle a été largement distribuée dans les packages faciles genre EasyPHP. Bref, tous les hébergeurs la proposent !
Pour le texte, je me sert seulement d'une police système, ce qui évite d'installer FreeType (d'un autre côté, si vous avez FreeType, çà permet d'utiliser n'importe quelle police True Type) !

signaler à un administrateur
Commentaire de bricethenetman le 25/07/2003 17:27:44

Ok merci matrey. Dsl pour mon double poste c'est pas volontaire bon ben j'installe ce script sur mon site mais en attendant je te mes un 10/10.

signaler à un administrateur
Commentaire de matrey le 26/07/2003 21:57:08

merci !
n'hésite pas a me communiquer une URL où je pourrai voir ton job !

signaler à un administrateur
Commentaire de Anthomicro le 01/04/2004 20:29:42

Vive les variables globales !
Et l'indentation du code, c'est plus clair...

(désolé je mets un commentaire vite fait : je fais comme toi quand tu commentes les sources des autres, que de la critique, Cf. autre post sur l'image cryptée)

signaler à un administrateur
Commentaire de larr le 10/06/2004 05:23:25

Moi j'ai un bleme  l'image veus pas ce creer pourtant j'ai bien la gd 2
peus etre ça viendrais des chmod ou un truc con jsuis sur
enfin si y'a moyen d'avoir quelque aide dessus c bon a prendre :p

signaler à un administrateur
Commentaire de UniCyclon le 21/06/2004 09:26:41

juste une remarque : pour faire des systèmes de protection par des images, comme celui présenté, il est en général d'utiliser des libraries complémentaires comme Image Magick, ou encore, et mieux, les CGI. Ces derniers permettent en effet des effets de distorsions, etc... que ne permettent pas GD

Voir à ce sujet le Gimpy-r du projet Captcha (http://www.captcha.net)

signaler à un administrateur
Commentaire de Kevin007 le 24/06/2004 19:49:53

Salut,
Je t'ai ajouté a ma liste de contacts MSN :
Ce code ne devrait pas exister !
Tu as oublié les variables globales !
Les choses valides en html (-&gt; ou Xhtml) tu connais pas !
Enfin bon ce code est "à mettre à la poubelle" !
J'ai passé une nuit pour remettre ce "code" d'aplomb !
A+

signaler à un administrateur
Commentaire de bayosky le 19/08/2005 15:43:30

Salut,

Je débute en php et ce script, même s'il n'est pas parfait, a le grand mérite d'être assez clairement documenté et de fonctionner. De plus on n'y trouve aucune trace suspecte de pompage dans une autre source ....

Je met donc 10, par principe.

A+
bien amicalement,

Bayosky.

P.S. pour Kevin007 : Euh, si vous êtes si fortiche, pourquoi ne proposez- vous pas vos propres codes... La base de données de code_source ne contient rien de vous me semble-t-il... aucun script, pas de site, ...

signaler à un administrateur
Commentaire de Anthomicro le 19/08/2005 15:53:51

Il a pourtant raison, ce code ne fonctionne pas avec les versions de php bien configurées...

signaler à un administrateur
Commentaire de matrey le 19/08/2005 16:03:38

J'ai posté cette source en juin 2003, et les variables globales n'étaient alors qu'une "nouveauté". Depuis j'ai eu la flemme de mettre à jour la source... dsl...

signaler à un administrateur
Commentaire de Kevin007 le 19/08/2005 19:09:44

Salut,

Pour répondre à la vérité énoncée par BAYOSKY :

Il est vrai que je me suis "un peu" emballé dans mon commentaire : je le regrette :D

Quant à mon nombre de sources : mon but profond est l'originalité... je ne poste donc pas les choses vues et revues... mais je vais bientôt poster un code qui permettra de compresser/décompresser des archives ZIP/BZIP/GZIP/TAR...

Quant à vous : la "seule" source que vous ayez postée attend toujours sa mise à jour "compatibilité" Firefox... lol

-> http://www.javascriptfr.com/code.aspx?ID=20870

Sans rancune ;)

A+

signaler à un administrateur
Commentaire de pythonsbz le 13/11/2006 15:30:14

en effet c tres bon comme code mais moi comme etant debutant, j'ai du mal a visualiser limage aliatoire.

signaler à un administrateur
Commentaire de tartane le 03/05/2007 19:14:46

Le dump de la table ne marche pas sous MySQL v5.  On crée une clé primaire dupliqué (2 fois) sur le champ id

signaler à un administrateur
Commentaire de coucou747 le 06/06/2007 13:08:29

ce captcha est comme celui ci :
http://www.phpcs.com/codes/CAPTCHA-GENERATEUR-IMAGE-AVEC-CODE-VOULUT-SYSTEME-ANTISPAM_42855.aspx
il se casse sur le meme principe :( c'est domage, ca en fait une protexion contre les bots basics, et/ou non cibles...
si tu veux vois du cassage de captcha t'as :
http://www.phpcs.com/codes/POURQUOI-CAPTCHA-NE-SONT-ILS-PAS-TOUS-SUR_42153.aspx
http://sam.zoy.org/pwntcha/

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,25 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.