Soyez le premier à donner votre avis sur cette source.
Vue 6 234 fois - Téléchargée 460 fois
<?php ////////////////////////////////////////////////////////////////////////////////\ // // // Nom du code : Anti_Flood_Sans_GD (Class php) // // Version : 1.0 // // Date de création: 17 / 08 / 2005 // // Auteur : FBNKCMaster <-|| Farid BEN KACEM ||-> // // E-mail : FBNKCMaster@hotmail.com // // // // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // // // // Remerciements à : // // -> GRenard pour ses remarques, ses règles // // de la bonnes programmation // // -> Arnotic pour l'idée de son code de génération // // de mots de passe sur cette adresse: // // (http://www.phpcs.com/code.aspx?ID=12787) // // -> Tous ceux qui peuvent apporter des critiques // // constructives à cette source // // // // |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // // // // Remarque : // // Merci de ne pas supprimer cette partie // // // // |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // // // // ENJOY IT!!! // // // ///////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ## Class anti-flood "anti_flood" ## ## fichier anti_flood.class.php ## class anti_flood { var $equiv = array(); //tableau qui contient var $decryptage = array(); //tableau qui contient var $nv_noms = array(); // tableau des nouveaux noms var $dos_img = 'img_flood'; // dossier qui contient les images var $dos_sess = 'sess_flood'; // dossier où sera créé un dossier pour chaque session var $nbr_carac_code; //Nombre de carctères du code à saisir var $nbr_crypt_code; // Nombre de caractères pour crypter les noms originels des images var $sess; // la variable de la session function anti_flood($nbr_car, $nbr_cryp) //le constructeur { $this->nbr_carac_code = $nbr_car; $this->nbr_crypt_code = $nbr_cryp; $this->sess = session_id(); // On génère un id pour la session $this->suppr_dos(); //On vide le dossier des sessions "sess_flood" au cas où la vérification n'est pas faite $code = $this->gen($this->nbr_carac_code,'num'); for($i = 0; $i < $this->nbr_carac_code; $i++) // On fait correspondre chaque caractère à une image à qui on génère un nouveau nom aléatoire à l'aide de la méthode $this->gen() { $this->attribuer($code{$i}, $this->gen($this->nbr_crypt_code, 'alpha')); } $this->sess(); // On enregistre toutes les variables (tableaux) pour les traiter lors de la vérification } function suppr_dos() // La méthode pour supprimer les dossiers des sessions créés et leurs fichiers { $dos = opendir($this->dos_sess); while ($fichier = readdir($dos)) { $l = array('.', '..'); if (!in_array( $fichier, $l)) { if (is_dir($this->dos_sess.'/'.$fichier)) { $s_dos =opendir($this->dos_sess.'/'.$fichier); WHILE($f = readdir($s_dos)) { @unlink($this->dos_sess.'/'.$fichier.'/'.$f); } @closedir($s_dos); @rmdir($this->dos_sess.'/'.$fichier); }else { unlink($this->dos_sess.'/'.$fichier); } } } @closedir($doss); } function gen($nbrcar, $car) // La méthode qui génère les codes { @mkdir($this->dos_sess.'/'.$this->sess, 0777); $caracteres = array('num' => '0123456789', 'alpha' => 'abcdefghijklmnopqrstuvwxyz'); $nbr_caracteres = strlen($caracteres[$car]); $code = ''; for($i = 0; $i < $nbrcar; $i++) { $code .= $caracteres[$car]{mt_rand()%$nbr_caracteres}; } return $code; } function attribuer($nom_orig, $crypt) // La méthode qui attribue chaque code généré à chaque image qui sera affichée (la méthode qui crypte les noms originels des images affichés) { if(array_key_exists($nom_orig, $this->equiv)) // Si la clef (qui correspond au nom original de l'image) existe déjà dans notre tableau "$this->equiv" { // $nom_orig existe déjà, on ajoute "l'ancien" nouveau nom au tableau "$this->nv_noms" $this->nv_noms[] = $this->equiv[$nom_orig]; }else { // $nom_orig n'existe pas => donc on ajoute au tableau le code généré à cette clef qui sera son index $this->copier_img($nom_orig, $crypt); // On copie l'image avec son nouveau nom crypté $this->equiv[$nom_orig] = $crypt; } $this->decryptage[] = $this->equiv[$nom_orig]; // Un autre tableau "indispensable!" qui contient les codes de toutes les cles (noms des images) à affiché } function copier_img($nom_orig, $nv_nom) // La méthode qui copie l'image à afficher avec le nouveau nom crypté vers le dossier de la session { if(copy($this->dos_img.'/'.$nom_orig.'.jpg', $this->dos_sess.'/'.$this->sess.'/'.$nv_nom.'.jpg')) { // L'image est copiée avec succès donc on ajoute son nouveau nom au tableau "$this->nv_noms" $this->nv_noms[] = $nv_nom; }else { // Sinon on affiche une image nom trouvée echo '<img src="x.jpg" alt="" />'; } } function afficher() // La méthode qui affiche les images avec leurs nouveaux noms et emplacement { foreach($this->nv_noms as $nv_nom) { echo '<img src="'.$this->dos_sess.'/'.$this->sess.'/'.$nv_nom.'.jpg" alt="" />'; } } function sess() // La méthode qui enregistre le nom de la session et les tableaux qu'on va traiter dans la class verif_flood.class.php et on les passe par une variable session { $tableau[] = $this->equiv; $tableau[] = $this->decryptage; $_SESSION[$this->sess] = $tableau; } } ?> ################################################### <?php ////////////////////////////////////////////////////////////////////////////////\ // // // Nom du code : Anti_Flood_Sans_GD (Class php) // // Version : 1.0 // // Date de création: 17 / 08 / 2005 // // Auteur : FBNKCMaster <-|| Farid BEN KACEM ||-> // // E-mail : FBNKCMaster@hotmail.com // // // // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // // // // Remerciements à : // // -> GRenard pour ses remarques, ses règles // // de la bonnes programmation // // -> Arnotic pour l'idée de son code de génération // // de mots de passe sur cette adresse: // // (http://www.phpcs.com/code.aspx?ID=12787) // // -> Tous ceux qui peuvent apporter des critiques // // constructives à cette source // // // // |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // // // // Remarque : // // Merci de ne pas supprimer cette partie // // // // |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // // // // ENJOY IT!!! // // // ///////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ## Class de verification "verif_flood" ## ## fichier verif_flood.class.php ## require_once('anti_flood.class.php'); class verif_flood extends anti_flood // On herite de la class mère "anti_flood" { var $code_saisi; function verif_flood($code) // Le constructeur8 { $this->code_saisi = $code; $this->sess = session_id(); // On cherche l'id de la session $tableaux = $_SESSION[$this->sess]; // On extrait les tableaux => un tableau multi-dimensionnel foreach($tableaux as $v) // On reconstruit les sous-tableaux { $st[] = $v; // "st" = sous-tableau } $this->equiv = $st[0]; // Là juste pour attribuer le nom à chaque sous tableau pour pas se perdre après... $this->decryptage = $st[1]; $this->suppr_dos(); // On vide le dossier des sessions "sess_flood" //return $this->verifier(); // On vérifie } function verifier() // La méthode qui decrypte et verifie le code entré { $nbr_carac_code = strlen($this->code_saisi); //Et là on crypte le code entré: chaque caractère entré correspond à un code qu'on va récupérer dans le tableau d'equivalence "$this->equiv" ayant comme clefs les noms originaux des images $crypt = ''; for($i = 0; $i < $nbr_carac_code; $i++) { if(isset($this->equiv[$this->code_saisi{$i}])) $crypt .= $this->equiv[$this->code_saisi{$i}]; } // On obtient le code crypté qu'on va comparer avec la suite des codes générés pour chaque images... C'est un peu difficil à comprendre du premier coup mais il faut juste méditer c'est simple l'idée! //Ici on decrypte..non on fait juste sortir et coller les codes générés, de chaque image, du tableau dont j'ai dit "indispensable!"... maintenant je crois que vous compreniez pourquoi ;) $decrypt = ''; foreach($this->decryptage as $v) { $decrypt .= $v; } // On obtient la suite des codes les uns après les autres générés // On compare les deux codes obtenus if($crypt === $decrypt) { // C'est le bon code return true; }else { // C'est pas le bon code return false; } } } ?>
la voici: http://www.phpcs.com/code.aspx?ID=39397
++
Je viens de poster une nouvelle source, que j'ai codé juste la nuit, elle traite encore de l'anti-flood sans gd..eh oui le petit marcel il faut le porteger à n'importe quel prix! ;P
Suite à vos remarques et critiques (merci) et surtout la dernière suggestion de masternico, l'idée de l'application falsh, j'ai donc fait un petit mélange flash/php très basique et j'aimerai bien si vous y jetter un coup d'oeil pour vos critiques et essayer de l'améliorer.
Et pour celle là, si j'aurai plus de temps, j'essayerai de voir comment appliquer l'idée de malik, sinon ça reste comme ça pour l'instant.
++
Bien que le sujet de la sécurité aurait pu faire l'objet d'un post à part, je voulais répondre à Grenard qui disait qu'un robot ne pouvait déchiffrer facilement la zone chiffrée.
Il est une appliquation que pratiquement tout détenteur de scanner possède : un reconnaisseur de caractères qui te lit une page de livre et la transcrit en fichier texte modifiable. Si un tel programme fonctionne sur l'ordi des communs des mortels, alors imagine ce que peut faire le même programme sur l'ordi d'un hacker acharné et débrouilard. Il lui suffit juste de "scanner" la portion de l'écran ou apparait l'image chiffrée et optient en retour le numéro correspondant.
Donc même si l'idée de ne pas utiliser la GD pour faire son affaire est interessante, cela demandera un peut plus que de simples images de chiffres, car même si le but est de proteger le petit marcel en maillot de bain (lol, je l'ai trouvée excelente celle la), le hacker finira par s'en occuper car son but est de montrer qu'il est plus fort que les autres... Et comme tu l'empêche de passer à son aise, il forcera le passage, peut importe ce qui se trouve au bout... juste pour le fun...
F BNKCM ==> j'espère que tu n'as pas baissé les bras car l'idée est interessante. Il faudrait remplacer les images par une application flash qui afficherait un piaf sur un arbre, et il faudrait pouvoir répondre s'il se trouve sur la branche, sur la racine, etc... comme l'application flash est une vidéo, cela complique la tâche d'un ou d'une hackeuse (pourquoi pas, on se les imagine toujours binoclar et moche comme des poux... mais c'est peut être une petite pépé roulée comme une déesse? he he he) qui s'attache à déchiffrer une image fixe. De plus, il faudrait un timer de temps de réponse pour éviter que le robot n'ai trop de temps pour répondre à la question...
A+
Anthomicro et Psykocrash => Alors en fin de compte mon petit code devient inefficace :(
Je suis d'accord, mais pour un site sans la GD, c'est peut être une solution efficace surtout si on la combine avec l'idée que Malik7934 a proposé un peu plus haut.
Si j'ai un peu de temps je pourrais m'y pencher dessus.
Psykocrash => Les critiques constructives sont toujours les bienvenues (même si elles sont vexantes des fois..snif...) ;)
Merci pour votre contribution.
++
Mais bon je crois qu'il faudrait qu'on en reste là, sinon il va être dégouté d'avoir posté sur phpcs :p
f bnkcm c'est pas toi qu'on critique, c'est la méthode !!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.