begin process at 2012 05 27 20:42:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Formulaires

 > TURING NUMBER

TURING NUMBER


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Formulaires Niveau :Débutant Date de création :18/06/2004 Date de mise à jour :29/07/2005 09:09:32 Vu / téléchargé :8 915 / 638

Auteur : RedFo1

Ecrire un message privé
Site perso
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Un turing number est une image contenant un code difficile à lire, que l'utilisateur doit entrer pour valider un formulaire, ce qui permet d'empêcher un robot de soumettre le formulaire.
La capture d'écran n'est pas très jolie... mais bon, je ne me suis occupé ici que du code, je vous laisse faire votre présentation :)

Contenu du zip :
- lisez-moi.txt : divers info sur le script (copyright, où  trouver la dernière version...), où demander de l'aide...
- mpam4_php02_turing_1.1.7z : la version originale
- mpam4_php05_turing_session_ed_1.1.7z : la Session Edition

Requis (version originale) : PHP et MySQL
Requis (Session Edition) : PHP seulement

Inspiré de : IMAGE CRYPTÉE DE PROTECTION POUR FORMULAIRE WEB, par matrey : http://www.phpcs.com/code.aspx?ID=13359
et publié avec l'aimable autorisation de l'auteur

Blabla légal :) : ce script est gratuit, vous pouvez le modifier/redistribuer sous les termes du GNU General Public License publié par la Free Software Foundation, soit la version 2 de la licence, ou (à votre convenance), n'importe quelle version ultérieure (voir le fichier readme).

La source suivante n'est que le fichier l_gen.php (qui génère l'image). Pour le reste, voir le zip.

Mise à jour : inclusion du code posté par matrey pour le code en lettres, amélioration de la présentation du code (source), quelques modifications du code de génération de l'image, avec des pixels de bruit plus nombreux et de toutes les couleurs, une marge à gauche aléatoire et plus de commentaires.

**** le code ci-dessous est la version précédente !  ****
****         la MAJ est uniquement dans le zip          ****

Source

  • <?php
  • if(!isset($_GET["session"])){die("Error generating turing number : no session specified. Get outta here ! :p");}
  • include("l_db.php");
  • $session=$_GET["session"];
  • $sql = "SELECT code FROM turings WHERE session ='$session'";
  • $resultat = mysql_query($sql);
  • $ligne = mysql_fetch_array ($resultat) or die('');
  • $code=$ligne['code'];
  • mysql_close();
  • // Création de l'image, vous ne devriez modifier les dimensions que si vous modifiez la longueur du code ! enfin, vous faites ce que vous voulez... :)
  • $largeur=72;
  • $hauteur=25;
  • $img = imagecreate($largeur, $hauteur) or die("Cannot Initialize new GD image stream");
  • // Les couleurs...
  • $bgc = imagecolorallocate($img, rand(235,255), rand(235,255), rand(235,255)); // la couleur de fond sera au hasard...
  • $black = imagecolorallocate($img, 0, 0, 0);
  • $gris = imagecolorallocate($img, 128, 128, 128);
  • // Remplissage du fond
  • imagefilledrectangle($img, 0, 0, $largeur, $hauteur, $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
  • $hor_pos=12; // position horizontale, à incrémenter à chaque fois ! (au hasard... :) )
  • for($i=0;$i<strlen($code);$i++)
  • {imagestring($img, 5, $hor_pos, rand(2,10), $code[$i], $black);$hor_pos+=rand(10,15);}
  • // Là, on va rendre l'image franchement dure à lire :
  • // Ajout d'un bruit (pixels)
  • for($i=0;$i<150;$i++)
  • {
  • imagesetpixel($img, rand(0,$largeur), rand(0,$hauteur), $gris);
  • }
  • // Ajout d'un bruit (lignes) N'en mettez pas trop, sinon c'est carrément illisible...
  • for($i=0;$i<5;$i++)
  • {
  • if($i<2){$x1=rand(0,$largeur);$y1=0;$x2=abs($x1-rand(0,5));$y2=$hauteur;}
  • else {$x1=0;$y1=rand(0,$hauteur);$x2=$largeur;$y2=abs($y1-rand(0,5));}
  • imageline($img, $x1, $y1, $x2, $y2, $black);
  • }
  • // 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");
  • header("Content-Type: image/png");
  • ImagePNG($img);
  • imagedestroy($img);
  • ?>
<?php
if(!isset($_GET["session"])){die("Error generating turing number : no session specified. Get outta here ! :p");}

include("l_db.php");

$session=$_GET["session"];
$sql = "SELECT code FROM turings WHERE session ='$session'";

$resultat = mysql_query($sql);
$ligne = mysql_fetch_array ($resultat) or die('');

$code=$ligne['code'];
mysql_close();

// Création de l'image, vous ne devriez modifier les dimensions que si vous modifiez la longueur du code ! enfin, vous faites ce que vous voulez... :)
$largeur=72;
$hauteur=25;
$img = imagecreate($largeur, $hauteur) or die("Cannot Initialize new GD image stream");
// Les couleurs...
$bgc = imagecolorallocate($img, rand(235,255), rand(235,255), rand(235,255));	// la couleur de fond sera au hasard...
$black = imagecolorallocate($img, 0, 0, 0);
$gris = imagecolorallocate($img, 128, 128, 128);
// Remplissage du fond
imagefilledrectangle($img, 0, 0, $largeur, $hauteur, $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
$hor_pos=12; // position horizontale, à incrémenter à chaque fois ! (au hasard... :) )
for($i=0;$i<strlen($code);$i++)
	{imagestring($img, 5, $hor_pos, rand(2,10), $code[$i], $black);$hor_pos+=rand(10,15);}

// Là, on va rendre l'image franchement dure à lire :
// Ajout d'un bruit (pixels)
for($i=0;$i<150;$i++)
	{
	imagesetpixel($img, rand(0,$largeur), rand(0,$hauteur), $gris);
	}
// Ajout d'un bruit (lignes) N'en mettez pas trop, sinon c'est carrément illisible...
for($i=0;$i<5;$i++)
	{
	if($i<2){$x1=rand(0,$largeur);$y1=0;$x2=abs($x1-rand(0,5));$y2=$hauteur;}
	else {$x1=0;$y1=rand(0,$hauteur);$x2=$largeur;$y2=abs($y1-rand(0,5));}
	imageline($img, $x1, $y1, $x2, $y2, $black);
	}

// 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");
header("Content-Type: image/png");
ImagePNG($img);
imagedestroy($img);

?>

 Conclusion

Là, désolé, mais je sais pas quoi mettre comme conclusion : j'ai déjà tout dit, je crois. Les commentaires sont les bienvenus (en particulier les idées pour mieux "tagger" l'image :) )
Merci à matrey pour tous ces commentaires :)
Afin de garder la meilleure compatiblité possible, je n'ai pas inclus le code d'utilisation des truetypes... De toutes façons, c'est pas très compliqué :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • lisez-moi.txtTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 378 octets
  • mpam4_php02_turing_1.1.7zTélécharger ce fichier [Réservé aux membres club]9 830 octets
  • mpam4_php05_turing_session_ed_1.1.7zTélécharger ce fichier [Réservé aux membres club]9 198 octets

Télécharger le zip


 Historique

29 juillet 2005 09:09:32 :
- Correction d'une faille de sécurité (encore une injection SQL...) - Ajout d'une version qui n'utilise pas de base de données (plus besoin de MySQL !) : c'est la Session Edition. Dans l'archive, vous avez 2 archives : la version originale et la Session Edition

 Sources du même auteur

Source avec Zip Source avec une capture CONVERSION IP VERS PAYS
Source avec Zip Source avec une capture PHPBTTRACKERMOD : TRACKER POUR TORRENTS
Source avec Zip Source avec une capture FORMULAIRE D'INSCRIPTION AVEC VÉRIFICATION DE L'E-MAIL PAR C...
Source avec Zip ENCORE UN COMPTEUR (DÉSOLÉ) : VISITEURS UNIQUES ET HITS
Source avec Zip Source avec une capture PROTECTION DE PAGES PAR LOGIN ET MOT DE PASSE

 Sources de la même categorie

Source avec Zip Source avec une capture VALIDATEUR DE FORMULAIRE par Reldan
Source avec Zip SUIVI SERVICE CLIENT PHP par hige52
Source avec Zip POO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COM par mtrix000
Source avec Zip Source avec une capture SELECTEUR DE NOTE par Reldan
Source avec Zip Source avec une capture ESPACE MEMBRE , AVEC CASE OPTIONNEL , SANS MYSQL par sartoz

Commentaires et avis

Commentaire de Taka_s_tiger le 18/06/2004 23:37:30

j'en avais fait un semblable sans base de donnée ( http://www.phpcs.com/code.aspx?ID=21585 )...la seule sugestion que j'aurais a te faire...c'est d'augmenté le nombre de pixel alléatoire en arrière plan...sinon c'est bien

Commentaire de RedFo1 le 19/06/2004 07:02:11

zut alors, je ne l'avais pas vu, ni celui mis dans les comentaires qu'il a reçu ( http://phpcs.com/code.aspx?ID=21319 ). Enfin... je voudrais pas faire de la pub, mais avec une DB, cest mieux non ? ;) Bon d'accord, je suis pas impartial... :)

Sinon, pour ce qui est des pixels, je me rends bien compte que ce n'est pas beaucoup, mais en fait, j'avais presque envie de ne pas les mettre : je pense qu'ils peuvent être supprimés facilement en ne gardant que la couleur de la police, vu que les pixels sont d'une couleur différente... Je préfère les lignes (de la même couleur que la police :) ) et j'ai laissé les pixels surtout pour que le script soit facile à modifier.

Commentaire de mindkiller le 19/06/2004 15:56:28

C sympa mais ce genre de script de fais en 2 fichier : Form.php (avec le formulaire et la generateur d'image gif) et tables.sql .
Essai de reduire le nombre de page seulement sinon c'est bien ^_^

Commentaire de matrey le 19/06/2004 19:33:44

mindkiller &gt; oui et non, car avec ce système en plusieurs fichiers tu peux utiliser la génération d'images pour plusieurs formulaires indépendants ! et puis là c'est "brut", pke les infos de connexion doivent exister déjà qque part sur ton site, tu supprime également le fichier de génération de la table quand elle est créée. Donc au final tu as le fichier de config MySQL, ton formulaire et le fichier pour générer l'image.

Commentaire de RedFo1 le 19/06/2004 19:36:24

euh... je ne vois pas comment mettre le formulaire + l'image en un seul fichier : pour l'image, il faut écrire des headers, et si on écrit des headers d'image, impossible d'écrire dans le même fichier du code XHTML. Enfin, dites-moi si je dis une boulette :)
Par contre, tu peux passer de 3 fichiers sur le serveur à 2 fichier, en recopiant l_db.php dans chacun... (je ne compte pas la création de la table, qui ne sert qu'une fois)

Commentaire de matrey le 21/06/2004 10:19:27

taka_s_tiger &gt; L'utilisation d'une BDD comme je l'ai également fait dans ma source me semble indispensable pour stocker un identifiant de session et un délimiteur de temps car sinon tu vas notamment devoir passer le code à taper dans le code HTML, et donc le but de ne pas pouvoir être lu par une machine ne tient plus...

--

On ajoute couramment un peu de bruit, mais c'est plus dans un but décoratif à mon avis, car du moment qu'il y a une image une machine ne peut pas "lire" dessus.

Au niveau de la police, tu utilises la police système de PHP dans sa plus grande taille. Tu peux aussi, si tu as la librairie FreeType compilée avec PHP, remplacer :
imagestring ( resource image, int font, int x, int y, string s, int col)
imagestring($img, 5, $hor_pos, rand(2,10), $code[$i], $black);
par
imagettftext ( resource image, int size, int angle, int x, int y, int color, string fontfile, string text)
imagettftext($img, 12, 0, $hor_pos, rand(2,10)+15, $black, "/londontwo.ttf", $code[$i]);

Attention à deux choses : le positionnement n'est pas le même, d'où le "+ 15" niveau vertical, et autre chose, le chemin vers le fichier TTF est assez difficile à définir (faut bidouiller longtemps avant d'arriver à trouver le chemin qui marche).
Tu peux l'inclure dans ton code et par exemple faire un test pour savoir si FreeType est installé sur le serveur :
$tableau = gd_info();
if ($tableau["FreeType Support"] == false){
imagestring...
}else{
imagettftext...
}

Après, autre chose, je trouve plus simple de mettre un mot plutôt que des chiffres. Pour cela, j'utilise un array pour les consonnes et un autre pour les voyelles, puis je pioche au hasard, avant de tout mettre en majuscules (plus lisible).

$vowels = array("","a","e","i","o","u","y");
$consonants = array("","b","c","d","f","g","h","j","k","l","m","n","p","r","s","t","v","w","z");
$code = "";
$i = 1;
while($i&lt;=2){
$code .= $consonants[mt_rand(1, 18)].$vowels[mt_rand(1, 6)];
$i++;
}
$code = strtoupper($code);

Sinon une remarque à propos de ton code : penses bien à l'indenter à chaque function/if/while..., c'est beaucoup plus lisible.

Voila mon pitit speech est fini, et je conclus par la note : 10/10 quand même, car mes remarques portent sur des détails

Commentaire de RedFo1 le 21/06/2004 20:53:31

En fait, mon "modèle" est le turing number de e-gold, qu'on peut voir sur cette page : https://www.e-gold.com/acct/login.html. Vu comme ils défigurent bien les chiffres, je suppose qu'ils doivent penser qu'il est possible qu'une machine lise le code sur une image (avec un moteur OCR, pourquoi pas ?).
Pour ce qui est du code en lettres : il doit nous sortir de bien jolis mots celui-là ! ;)
Quant à l'indentation, c'est vrai que là je me suis laissé aller, d'habitude j'aère mieux... mais c'était si agréable de voir tout ce code rentrer dans une si petite portion d'écran... :)
Je pense que je vais faire une mise à jour en incluant le code textuel + une présentation plus convenable.
La librairie freetype par contre... est-ce que tu connais le nom du dll ?

Commentaire de matrey le 21/06/2004 21:06:23

Je me reprends moi même (:O) sur un point : "On ajoute couramment un peu de bruit, mais c'est plus dans un but décoratif à mon avis, car du moment qu'il y a une image une machine ne peut pas "lire" dessus."

En fait j'ai tort dans le sens que techniquement c'est possible, avec un système d'OCR. Cependant, je vois mal le script-kiddie qui voulait engorger ta BDD d'inscriptions bidon en train d'utiliser des solutions encore peu "démocratisées", et surtout pas du tout automatiques...
Pour tromper un système d'OCR, cela se révèle d'ailleurs très difficile, avec tout le bruit que tu veux il arrivera à lire presque mieux qu'un humain :D La solution tiendrait dans l'ondulation/déformation du texte, avec des ombrés contenant un texte différent pour tromper la machine.
Mais je maintiens qu'actuellement c'est inutile d'aller pousser la protection plus loin que le script ci-dessus.

--

RedFo1 &gt; Si je ne dis pas de bétises, FreeType est une librairie qui doit être compilée avec GD, donc pas de dll extérieure. De plus, depuis PHP 4.3, GD est inclus en standard dans PHP, avec FreeType. Regarde soit ton phpinfo(), soit comme dans mon précendent commentaire :
$tableau = gd_info();
$tableau["FreeType Support"] == ...

Quant aux mots que çà génére, en général çà reste correct :D
Sur mon site je l'ai mis à 6 caractères, et j'avoue avoir inclus un "garde-fou", pour éviter que le visiteur doive taper "DEGAGE" ou pire... ;-)

Commentaire de quiaimeflash le 18/10/2004 18:45:37

Bonjour,
Tout d'abors félicitations pour ton code, il super !

Par contre j'aimerais savoir comme ont installe les librairies pour le faire fonctionner, car sur mon hébergeur sa marche nickel, mais en local sur easyphp 1.7 + php4.3.3 et mysql, il doit me manquer un petit truc, car il ne m'affiche pas l'image, il n'arrive pas  à la générée.

Commentaire de RedFo1 le 27/10/2004 22:48:03

salut,

dsl de ne pas répondre plus tôt, j'ai mis une alerte pour quand un commentaire est ajouté, mais ça marche pas (?!).
Pour ce qui est de l'installation de la librairie, je crois qu'il suffit de modifier le fichier php.ini qui se trouve dans le dossier windows : à la ligne :
;extension=php_gd2.dll , il faut enlever le point-virgule (=commentaire).
Il faut aussi vérifier que le champ extension_dir est bien renseigné (c'est le dossier qui doit contenir php_gd2.dll) (ex : chez moi, j'ai :
extension_dir = "C:\Program Files\Apache Group\PHP4\extensions" ).

Sinon... dsl pour la présentation de ce commentaire, mais la petite textarea est vraiment peut pratique pour relire... :)

Commentaire de RedFo1 le 17/02/2005 19:20:30

Hello,

voici le lien vers la dernière MAJ : http://mpam.free.fr/v3/ourfreestuff.php?p=php_02
(je ne la poste pas ici car j'ai traduit tous les commentaires en anglais)

@+

Commentaire de eaurdinateur7 le 01/06/2005 11:30:27

Salut,
j'ai essaye ce code, il m'a donne l'erreur suivante: call to undefined function "imagecreate" dans le fichier l_gen,
je vous serais reconnaissante si vous m'aidiez a le faire fonctionner.
merci en avance

Commentaire de RedFo1 le 01/06/2005 16:52:19

salut,

je crois avoir trouvé : dans php.ini, cherche la ligne
;extension=php_gd2.dll
et décommente-la (c'est-à-dire, enlève le ; au début) :
extension=php_gd2.dll
Si tu n'est pas l'admin du serveur, demande à l'admin s'il peut ajouter la librairie GD (php_gd2.dll)

@+

Commentaire de testetrtr le 05/06/2005 17:01:12

merci pour le code ,

y a il pas de mis a jours plus recentes?

Commentaire de RedFo1 le 05/06/2005 17:20:16

Salut,

La dernière version est la 1.6, disponible ici : http://rebooted.free.fr/index.php?p=21
Elle contient en particulier des MAJ au niveau de la sécurité.
(remarque : il faut 7-zip pour la dézipper. 7-Zip est gratuit et téléchargeable sur 7-zip.org)

@+

Commentaire de RedFo1 le 05/06/2005 17:24:55

Re,

zut, je me suis trompé de code ! (je suis allé voir une de tes discussions ce qui m'a fait croire que tu parlais de mon formulaire d'inscription avec code de vérification pour l'e-mail, décidément je suis incorrigible...)
La dernière version du turing number est donc ici : http://rebooted.free.fr/index.php?p=19
Je ne crois pas qu'elle contienne de grandes nouveautés par rapport à la source d'ici.

@+

Commentaire de eaurdinateur7 le 07/06/2005 17:15:14

salut,
merci a REDF01, j'ai enleve le commentaire ';'
et le code fonctionne tres bien maintenant

Commentaire de testetrtr le 12/06/2005 13:14:23

j'arrive pas   a ajouter ce script a mon formulaire.
quand je l'ajoute au formulaire , soit une partie du formulaire n'apparais pas , soi l'inscription se fait sans prendre en compt le script.
si qq peux m'aider avec un exemple    merci

Commentaire de RedFo1 le 04/07/2005 08:18:27

Salut,

testetrtr -> dsl de n'avoir pas répondu plus tôt, mais c'est une question sinon compliquée, du moins fastidieuse... et j'étais en plein dans les examens. Poste ta source ici -> http://s4.invisionfree.com/MPAM_2/index.php?showforum=17 , je te montrerai quelles modifications y faire (enfin, j'essayerai).

eaurdinateur7 -> de rien :)

Commentaire de lawrent le 07/07/2005 20:40:18

hello a tous,

j'aimerai protéger un formulaire avec tout les systemes d image aléatoir que vous proposez mais je dois pas avoir les moduels qui fo de charger car G une croix a la place des images.

quel module dois je charger ? comment dois je l installer ?

je suis ss WIN XP

Merci d avance

Commentaire de RedFo1 le 07/07/2005 23:02:17

Salut,

Essaye ça :
(commentaire du 01/06/2005 16:52:19 ;) )
dans php.ini, cherche la ligne
;extension=php_gd2.dll
et décommente-la (c'est-à-dire, enlève le ; au début) :
extension=php_gd2.dll

@+

Commentaire de eaurdinateur7 le 09/09/2005 17:18:45

salut,
1*j'ai essaye de modifier la forme de l'image (pixels et lignes)
mais j'ai pas arrive a imiter limage que j'ai vu sur le site de http://www.moneybookers.com
si tu essaye de t'inscrire ou te connecter tu peux voir l'image et qui est aussi sur 6 chiffres,
2* j'ai change la longueur du code et les parametres de mt_rand, et varchar(4) dans la database mais ca pas marche
merci

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales