begin process at 2012 05 27 18:29:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité & Cryptage

 > SECURISATION D'INSCRIPTION AVEC IMAGE CRYPTÉE

SECURISATION D'INSCRIPTION AVEC IMAGE CRYPTÉE


 Information sur la source

Note :
9 / 10 - par 13 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Sécurité & Cryptage Niveau :Expert Date de création :13/05/2003 Date de mise à jour :13/05/2003 22:48:38 Vu / téléchargé :15 454 / 1 422

Auteur : aKheNathOn

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

 Description

Cliquez pour voir la capture en taille normale
Voici un script qui gére des images en mémoire et dont on doit en saisir leur contenu aléatoire(comme chez multimania par exemple) ...

Il permettra ainsi d'empecher les flooders par exemple, de créer des faux comptes à partir d'un script ou d'un logiciel .

Le systéme est composé de deux trables de transposage pour le cryptage et décryptage du message, et les gére en cookies.

Vous n'avez rien à faire, à par utiliser la fonction IsOk, et mettre une image dont la source sera get_img.php .

Paramétrage du script affichant les images :
get_img.php :
Voir à la ligne 3 :

CryptImage(10,3,250,250,100,15);
10 : Nombre de lettres
3 : Handicap ( granulositée de l'image)
250, 250, 100 : Couleurs RGB pour le fond de l'image
15 : Qualitée du JPEG envoyé ...

Si vous voulez rajoutter ce systéme dans votre page ... mettez juste une image pointant vers ce script .

Ensuite ... pour vérifier que l'utilisateur à bien saisit les chiffres :

require_once 'function.req.php';
$ok = IsOk($password, $HTTP_COOKIE_VARS["validation"]);
if ($ok == true) {
Il à bien saisit ...
} else {
Il à mal saisit
}

Attention : $HTTP_COOKIE_VARS["validation"] est un cookie utilisé par le systéme ... donc le nom ne doit pas être utilisé par vos scripts ... du moins lors de l'étape de validation ...

Un logiciel de génération de dictionnaire est fournit avec le code php, il est rédigé en Visual Basic et vous avez ses sources disponnibles .

Le script est assez technique donc désolé je ne vais vas m'attarder sur le sujet .

Un exemple d'utilisation est fournit avec le zip .  

Source

  • <?
  • // -----------------------------------------------------------------------
  • // Fonction de cryptage Image
  • // -----------------------------------------------------------------------
  • function CryptImage($longeur, $handicap, $r, $g, $b, $quality) {
  • if (!function_exists("ImageCreate")) return "Error : Librairie GD non instalée !";
  • // Fabriquation du code confidentiel
  • $dico1 = 'k|p|c|n|v|j|r|u|z|g|6|t|e|l|m|7|2|4|q|h|i|a|3|5|1|f|o|y|w|d|x|8|s|b|0|9';
  • $dico2 = 'n|3|m|k|i|y|b|e|o|d|g|2|j|x|6|1|v|z|l|h|u|8|r|w|a|t|4|f|c|p|0|9|q|s|5|7';
  • $dico1 = explode('|', $dico1);
  • $dico2 = explode('|', $dico2);
  • $caption = '';
  • for($i=0; $i<$longeur; $i++) {
  • $pos = rand(0,count($dico1)-1);
  • $password .= $dico2[$pos];
  • $caption .= $dico1[$pos];
  • }
  • $largeur = (12*$longeur);//+40;
  • $img = imagecreate($largeur, 25);
  • $bgc = imagecolorallocate($img, $r, $g, $b);
  • $black = imagecolorallocate($img, 0, 0, 0);
  • imagefilledrectangle($img, 0, 0, $width, $height, $bgc);
  • imagettftext($img, 20, 0, 0, 18, $black, "courbd.ttf", $caption);
  • for($i=0;$i<$handicap*100;$i++) {
  • imagesetpixel($img, rand(0,$largeur), rand(0,25), rand(0,65000));
  • }
  • // 5 - Enregistrement du fichier
  • header("PHP Scripts Author: C. CHIRIAC");
  • header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
  • header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  • // always modified
  • header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
  • header("Cache-Control: post-check=0, pre-check=0", false);
  • header("Pragma: no-cache");
  • setcookie("validation", $password);
  • imagejpeg($img, '', $quality);
  • imagedestroy($img);
  • }
  • function IsOk($password, $validation) {
  • $dico1 = 'kpcnvjruzg6telm724qhia351foywdx8sb09';
  • $dico2 = 'n3mkiybeodg2jx61vzlhu8rwat4fcp09qs57';
  • if(strlen($validation)!=strlen($password)) return false;
  • for ($i=0; $i<strlen($password); $i++) {
  • $lettre = substr($password,$i,1);
  • $pos = strpos($dico1, $lettre);
  • if (substr($validation, $i, 1)!=substr($dico2, $pos,1)) return false;
  • }
  • return true;
  • }
  • ?>
<? 
// -----------------------------------------------------------------------
// Fonction de cryptage Image
// -----------------------------------------------------------------------
function CryptImage($longeur, $handicap, $r, $g, $b, $quality) {
if (!function_exists("ImageCreate")) return "Error : Librairie GD non instalée !";
// Fabriquation du code confidentiel
$dico1 = 'k|p|c|n|v|j|r|u|z|g|6|t|e|l|m|7|2|4|q|h|i|a|3|5|1|f|o|y|w|d|x|8|s|b|0|9';
$dico2 = 'n|3|m|k|i|y|b|e|o|d|g|2|j|x|6|1|v|z|l|h|u|8|r|w|a|t|4|f|c|p|0|9|q|s|5|7';
$dico1 = explode('|', $dico1);
$dico2 = explode('|', $dico2);
$caption = '';
for($i=0; $i<$longeur; $i++) {
	$pos = rand(0,count($dico1)-1);
	$password .= $dico2[$pos];
	$caption .= $dico1[$pos];
}
$largeur = (12*$longeur);//+40;
$img = imagecreate($largeur, 25);
$bgc = imagecolorallocate($img, $r, $g, $b);
$black = imagecolorallocate($img, 0, 0, 0);
imagefilledrectangle($img, 0, 0, $width, $height, $bgc);
imagettftext($img, 20, 0, 0, 18, $black, "courbd.ttf", $caption);
for($i=0;$i<$handicap*100;$i++) {
	imagesetpixel($img, rand(0,$largeur), rand(0,25), rand(0,65000));
}

// 5 - Enregistrement du fichier
header("PHP Scripts Author: C. CHIRIAC");      
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
                                                     // always modified
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
setcookie("validation", $password);
imagejpeg($img, '', $quality);
imagedestroy($img);
}
function IsOk($password, $validation) {
	$dico1 = 'kpcnvjruzg6telm724qhia351foywdx8sb09';
	$dico2 = 'n3mkiybeodg2jx61vzlhu8rwat4fcp09qs57';
	if(strlen($validation)!=strlen($password)) return false;
	for ($i=0; $i<strlen($password); $i++) {
		$lettre = substr($password,$i,1);
		$pos = strpos($dico1, $lettre);
		if (substr($validation, $i, 1)!=substr($dico2, $pos,1)) return false;
	}
	return true;
}
?>   

 Conclusion

Version compatible :
PHP3 et PHP4
Necessite GD (version 1.x)
/!\ La version GD2 buggue avec cette fonction imagettftext($img, 20, 0, 0, 18, $black, "courbd.ttf", $caption); alors faut mettre le chemin de la fonte qui se trouve de le répértoire windows ... Je n'ait pas fait de tests sous linux.

Attention :

Il est conséillé d'utiliser le logiciel fournit avec le zip pour refaire les dictionnaires , car ils doivent être personels pour une sécurité optimale ... (ces dictionnaires étant publiques au même titre que mes sources ...)

Bonne prog à tous, et si certains mettent à jour le systéme de cryptage, (car j'ai eu la fleime de me pencher sur l'algo VIVE CESAR...) ben qu'ils me tiennent au courant en m'envoyant la mise à jour par mail : vbk@fr.st ... et je la mettrais à jour sur ce site pour en faire profitter tout le monde.  

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

CLASSE WIKILOC
Source avec Zip OBSERVER PATTERN ORIENTÉ DÉVELOPPEMENT ÉVÉNEMENTIEL DÉCLARAT...
Source avec Zip SERVICE DESIGN PATTERN / CHARGEMENT DYNAMIQUE DE SERVICES D'...
Source avec Zip Source avec une capture WHOIS DOMAIN CLASS : LOOKUP & AVAIBILITY
Source avec Zip Source avec une capture XML MAPPING TO CLASS OBJECTS / CHARGEMENT / PARSING / MODIFI...

 Sources de la même categorie

Source avec Zip Source avec une capture CAPTCHA AJAX ANTI-BOT par darkvador59
Source avec Zip Source avec une capture ACCÈS, ESPACE MEMBRE AVEC INSCRIPTION ET DÉSINSCRIPTION PAR ... par stephelle
Source avec Zip CRYPTAGE REVERSIBLE par Mokost
Source avec Zip Source avec une capture CREATION DE COMPTE AVEC CRYPTAGE ET ESPACE DE CONNEXION SEC... par bm1982
PROTÉGEZ VOS LIENS DE TÉLÉCHARGEMENT PAR MOT DE PASSE ET/OU ... par unlien

Commentaires et avis

Commentaire de matrey le 13/05/2003 19:46:02

putain !!!!!!! çà déchire !!!!! 11 / 10 !!!!!

Commentaire de Kirua le 13/05/2003 20:32:22

suis assez d'accord avec matrey, ce qui m'a surtout épaté en fait c qu'on puisse même paramètrer la granulosité !

Commentaire de mehdibou le 13/05/2003 21:50:43

Idem, excellent !! (Qu'est ce qu'on va bien pouvoir inventer nous maintenant ? :-?)

Commentaire de mathieumg le 14/05/2003 04:34:35

très bien !

Commentaire de iubito le 14/05/2003 17:18:22

ça doit être super, cependant un reproche, pas à toi, mais au système (notamment utilisé pour s'inscrire sur Yahoo) :

inutilisable pour les aveugles !
c'est comme si tu disais, tappez le mot que vous entendez (un petit .wav en bgsound...), et qu'un sourd arrive sur la page. ça revient au même

l'internet est déjà bien assez compliqué (images, design tordu, menu en layers, popup...) pour mes amis non-voyants, alors si complique encore plus.... :(

message crypté : la revedere si pe curând ;-) lol

Commentaire de aKheNathOn le 14/05/2003 20:59:49

Je ne vois pas l'intéret pour un aveugle de surfer sur le web, s'il ne peut pas lire le contenu des pages :))) ...

Parcontre, et là les gars vous êtes pas super en sécurisation, c'est que ce systéme comporte un trou de sécurité, mais personne n'a pris sans doute la peine de regarder comment ça fonctionne.

Si un mec trouve comment hacker le systéme en  une 10aine d'essay, il aura une sucette :) ... et le droit de le mettre à jour pour qu'il soit inviolable ...

Indice 1 : Penser au temps ... tic, tac ... et vous trouverez comment il sera inviolable ...
Pas de cryptage MD5, il faut le décrypter ensuite, et puis césar se fait vieux non  ?
(je vous en ait trop dit là ...)

Commentaire de matrey le 14/05/2003 21:02:26

Oui c'est pas con çà akhenathon :D Pour les aveugles, ils peuvent surfer sur le web avec des logiciels de synthèse vocale... mais je les vois mal remplir un formulaire effectivement :D (dsl pour eux...)

Commentaire de aKheNathOn le 14/05/2003 21:17:12

Juste pour la beautée du code je vous explique :

1 on demande de générer une image . Avant d'émmettre l'image, on génére un code client, celui affiché dans l'image, et un code de vérification , si possible crypté , mais qui validerais le code client . Pour cela j'utilise l'algo de césar (CAD A-&gt;B et B&lt;-A ) ... et c'est là le trou de sécurité .

On pourrais essayer de capter les cookies, envoyées avec l'image, et reconstruire le dictionnaire .

Au bout d'une dixaine de fois on aurais à peu prés le tout ...

Alors il faudrais que le code de validation soit cypté autrement, avec une variable, d'où le temps ... qui n'est jamais le même , et tant qu'à faire, l'ip de la personne+le nom du server local... pour que les scripts ne soient pas toujours les mêmes ...

Bréf en gros, là on aurais un systéme inviollable, mais pour un site normal, un hacker n'irais pas chercher jusque là pour le hacker (quand je dis hacker, je parle surtout de création de comptes poubelles fais par des logiciels en automatique, ou des hacktivistes qui veullent stopper le trafic du site...)

Au fait, multumesc iubitule ca mi-ai lasat un mic messaj, îmi face placere ;) ...

Bonne prog à tous, et je suis preneur pour les mises à jour, vbk@fr.st .

Commentaire de Kirua le 14/05/2003 21:19:28

mais non akhé faut pas décrypter qd t'utilises le MD5 !! tu fais une comparaiso nde deux chaînes cryptées par la même méthode (md5 donc) et si le résultat est pareil, c presque forcément que la chaien de départ était là même. (presque, càd que une fois sur 10?12 environ ça marche pas ^^ enfin la formule plus exacte serait (26+26+10) exposant 32 tu vois le genre :))

Commentaire de Kirua le 14/05/2003 21:27:49

1 chance sur 2,27e+57 que ce soit incorrect :D

Commentaire de aKheNathOn le 14/05/2003 22:48:53

Le code est envoyé au client ... sous forme décrypté dans l'image  puis sous forme cryptée en md5 dans le cookie ...

Quand on vérifie le script on à un password unique, donc on prend le cookie MD5 et on le compare avec la chaine du client aprés qu'elle soit cryptée en MD5 avec ce même password unique ...

En principe ça doit fonctionner, donc c'est à tester ...

Commentaire de bob3000 le 16/05/2003 18:59:42

wow! super bon!

Commentaire de mathieumg le 08/06/2003 02:01:14

Il génère une image vide ????

Pourquoi cela ???

Merci

Mathieu M-G

Commentaire de Bricomix le 07/07/2003 11:24:17

Sauf si je me trompe, pas besoin de MD5 si on utilise les sessions : le serveur génère le code qu'il enregistre en session. Le client appelle l'image &lt;img src="code.php" border="1"&gt;. L'image contient le code de la session. EN suite le client met le code, clique sur OK et là le script verifie que le tuc en session = le truc du client. Comme c'est au niveau session le client peut rien faire, je me goure ??

Commentaire de Kirua le 07/07/2003 13:03:05

oui t'as raison les variables de sessions sont "globales" et restes côté serveur.

Commentaire de aKheNathOn le 28/10/2003 02:47:52

Enfaite j'ai eu besoin de ce script pour le mettre sur un site et je pouvais pas laisser un tel systéme de cryptage ... donc je l'ait mis à jour en md5... La fleimme encore une fois de plus de mettre à jour la source, mais voilà, c'est juste un script a modifier :
faut faire du copier coller et effacer tout le script de function.req.php, et le remplacer par celui-ci :

function CryptImage($longeur, $handicap, $r, $g, $b, $quality) {
if (!function_exists("ImageCreate")) return "Error : Librairie GD non instalée !";
// Fabriquation du code confidentiel
$dico1 = 'k|p|c|n|v|j|r|u|z|g|6|t|e|l|m|7|2|4|q|h|i|a|3|5|1|f|o|y|w|d|x|8|s|b|0|9';
$dico1 = explode('|', $dico1);
$caption = '';
for($i=0; $i&lt;$longeur; $i++) {
$pos = rand(0,count($dico1)-1);
$caption .= $dico1[$pos];
}
$largeur = (12*$longeur);//+40;
$img = imagecreate($largeur, 25);
$bgc = imagecolorallocate($img, $r, $g, $b);
$black = imagecolorallocate($img, 0, 0, 0);
imagefilledrectangle($img, 0, 0, $width, $height, $bgc);
imagettftext($img, 20, 0, 0, 18, $black, "courbd.ttf", $caption);
for($i=0;$i&lt;$handicap*100;$i++) {
imagesetpixel($img, rand(0,$largeur), rand(0,25), rand(0,65000));
}

// 5 - Enregistrement du fichier
header("PHP Scripts Author: C. CHIRIAC");      
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                                                     // always modified
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
setcookie("validation", md5($caption));
imagejpeg($img, '', $quality);
imagedestroy($img);
}
function IsOk($password, $validation) {
if (md5($password)==$validation) {
return true;
} else {
return false;
}
}

Bonne prog à tous, akh

Commentaire de iubito le 28/10/2003 05:57:48

vaut mieux modifier ta source, parce que dans un message comme celui-là, les back-slashs (ou antislash ou ...  ) ne passent pas, si toutefois y'en a :-/

Commentaire de zzzzzz le 14/01/2004 19:34:44

Je n'arrive pas a copier une clé généré et je ne suis pas le seul grace a crypt.exe sinon le prog a l'air cool je v le tester pour mon formulaire :)

Commentaire de zzzzzz le 14/01/2004 20:52:03

Euh c normal qu'il n'y ai aucun code d'afficher ?!

http://www.diablus.com/code2/saisie.php

merci d'avance :)

Commentaire de vinyamar le 30/03/2004 21:55:23

Je n'ai pas la fonction "imagecreate" moi non plus, et donc rien n'apparaît dans le cadre.
Où trouve-t-on cette fonction ? (c'est ça qui me tue le plus moi)

Commentaire de Kirua le 30/03/2004 22:45:29

c'est la librairie GD

Commentaire de allserv le 07/07/2004 23:51:47

Juste comme cela, hsitoire de corcer un ti peu l'image rajouter cela après le } du for :

imageline ($img,0,(25/2),$largeur,(25/2),$black);


Cela donnera une ligne horizontale sur l'image...

Voilà et merci pour ce fabuleu script...

Commentaire de mathieumg le 08/07/2004 02:33:31

Moi jai mit la ligne de gauche a droite de l'image. Mais la hauteur varie de chaque côté ; p

Mathieu

Commentaire de lordskyser1 le 13/08/2005 13:03:22

Bonjour, je débute en php et il y a certaines lignes dont je ne vois pas l'utilité :

header("PHP Scripts Author: C. CHIRIAC");      
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
setcookie("validation", $password);

Et-ce que quelqu'un pourrait m'expliquer ces quelques lignes une à une s'il vous plaît?

Commentaire de peter4567 le 01/03/2006 19:47:04

Bonjour,
le script ne fonctionnant pas avec la librairie GD2 (ne trouve pas la police), j'ai trouvé cette cette astuce trouvé à la page http://fr.php.net/imagettftext

Dans le cas fréquent où une police réside dans le même dossier que le script l'utilisant, l'astuce suivante vous épargnera tous les problèmes.
<?php
// Définission de la variable d'environnement pour GD
putenv('GDFONTPATH=' . realpath('.'));

// Nom de la police à utiliser (notez l'absence de l'extension .ttf)
$font = 'SomeFont';
?>
Tout baigne maintenant

Commentaire de WhiteDwarf le 24/03/2006 13:17:31

lordskyser1>

Ligne de code qui dit au navigateur qui est l'auteur de la page...
header("PHP Scripts Author: C. CHIRIAC");  


Quand est-ce que la page expire ?
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

Dernière modification de la page, juste pour dire qu'elle est tout le temps modifiée (pour éviter que les moteurs de recherche enregistrent la page comme elle est, ou pour éviter que le navigateur garde l'image en cache alors que celle ci aura changé)
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");


Pareil, ca c'est pour le cache du navigateur...
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


Et enfin on enregistre le code généré dans un cookie histoire que lorsque l'on valide la page, la deuxième page qui sera chargé et qui vérifiera le code le connaitera... C'est obligatoire puisque le code est aléatoire...
setcookie("validation", $password);

Au lieu dedéfinir des cookies, on peu aussi le passer en post, si il est crypté en md5

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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,640 sec (3)

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