Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.02 KB | None | 0 0
  1.  Un dossier fonts/ avec des polices au format .ttf
  2.  Une image captcha.png dans le meme répertoire que captcha.php pour le fond du captcha
  3. Pour utiliser le captcha :
  4.  
  5. dans ton livre d'or tu mets :
  6.  
  7. ---
  8.  
  9. <!-- Notre image créée -->
  10.         <img src="captcha.php" alt="Captcha" id="captcha" />
  11.  
  12.         <!-- (JavaScript) Changer d'image à la volée si elle est illisible  -->
  13.         <a style="cursor:pointer;border-bottom:1px solid black;" onclick="document.images.captcha.src='captcha.php?id='+Math.round(Math.random(0)*1000)+1">Recharger l'image</a>
  14. <p>
  15.             <label for="userCode">Entrez le code que vous voyez sur l'image : &nbsp;&nbsp;</label>
  16.             <input name="userCode" class="textbox" type="text" />
  17.             <input type="submit" name="submit" class="submit" value="Poster" />
  18.  
  19. -----
  20.  
  21. Dans la page de traitement pour poster le message, pour vérifier si le captcha est bon :
  22.  
  23. if (!empty($_REQUEST['userCode']))
  24.     {
  25.         /* Conversion en majuscules */
  26.         $userCode = strtoupper($_REQUEST['userCode']);
  27.         /* Cryptage et comparaison avec la valeur stockée dans $_SESSION['captcha'] */
  28.     }
  29. else
  30.     {
  31.     echo 'Vous n'avez pas écrit le code !';
  32.         return false;
  33.     }
  34.  
  35. ---------------
  36.  
  37. captcha.php :
  38.  
  39. <?php
  40. /* ////////////////////
  41.     INITIALISATION
  42. //////////////////// */
  43.  
  44. /* Démarrage d'une session qui va nous permettre de stocker la valeur à recopier. */
  45. session_start(); // session_start() se place toujours avant toute sortie vers la page web
  46.  
  47. /* Chemin absolu vers le dossier */
  48. if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
  49.  
  50. /*
  51. Création d'une fonction pour générer la chaîne aléatoire à recopier (sans cryptage) :
  52. - strlen() retourne la taille de la chaine en paramètre
  53. - mt_rand(a, b) génère un nombre aléatoire entre a et b compris : cette fonction est plus rapide que rand() de la bibliothèque standard
  54. - $chars{0} retourne le premier caractère de la chaîne $chars, $chars{1} le deuxième ...
  55. */
  56. function getCode($length) {
  57.     $chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // Certains caractères ont été enlevés car ils prêtent à confusion
  58.     $rand_str = '';
  59.     for ($i=0; $i<$length; $i++) {
  60.         $rand_str .= $chars{ mt_rand( 0, strlen($chars)-1 ) };
  61.     }
  62.     return $rand_str;
  63. }
  64.  
  65. /* Stockage de la chaîne aléatoire de 5 caractères obtenue */
  66. $theCode = getCode(4);
  67.  
  68. /* Cryptage de la chaine avec md5() avant de la stocker dans la variable de session $_SESSION['captcha'] de la session en cours.
  69. C'est à cette variable qu'on va comparer le code entré par l'utilsateur dans le formulaire. */
  70. $_SESSION['captcha'] = md5($theCode);
  71.  
  72. /* Afin de traiter les caractères séparément, on les stocke un par un dans des variables. */
  73. $char1 = substr($theCode,0,1);
  74. $char2 = substr($theCode,1,1);
  75. $char3 = substr($theCode,2,1);
  76. $char4 = substr($theCode,3,1);
  77.  
  78. /*
  79. glob() retourne un tableau répertoriant les fichiers du dossier 'fonts', ayant l'extension .ttf ( pas .TTF ! ).
  80. Vous pouvez donc ajouter autant de polices TrueType que vous désirez, en veillant à les renommer.
  81. */
  82. $fonts = glob('fonts/*.ttf');
  83.  
  84. /* //////////////////////////////
  85.     TRAITEMENT DE L'IMAGE
  86. ////////////////////////////// */
  87.  
  88. /*
  89. imagecreatefrompng() crée une nouvelle image à partir d'un fichier PNG.
  90. Cette nouvelle $image va être ensuite modifiée avant l'affichage.
  91.  */
  92. $image = imagecreatefrompng('captcha.png');
  93.  
  94. /*
  95. imagecolorallocate() retourne un identifiant de couleur.
  96. On définit les couleurs RVB qu'on va utiliser pour nos polices et on les stocke dans le tableau $colors[].
  97. Vous pouvez ajouter autant de couleurs que vous voulez.
  98. */
  99. $colors=array ( imagecolorallocate($image, 131,154,255),
  100.                 imagecolorallocate($image, 89,186,255),
  101.                 imagecolorallocate($image, 155,190,214),
  102.                 imagecolorallocate($image, 255,128,234),
  103.                 imagecolorallocate($image, 255,123,123) );
  104.  
  105. /* Création d'une petite fonction qui retourne une VALEUR aléatoire du tableau reçu en paramètre. */
  106. function random($tab) {
  107.     return $tab[array_rand($tab)];
  108. }
  109.  
  110. /*
  111. Mise en forme de chacun des caractères et placement sur l'image.
  112. imagettftext(image, taille police, inclinaison, coordonnée X, coordonnée Y, couleur, police, texte) écrit le texte sur l'image.
  113. */
  114. imagettftext($image, 28, -10, 0, 37, random($colors), ABSPATH .'/'. random($fonts), $char1);
  115. imagettftext($image, 28, 20, 37, 37, random($colors), ABSPATH .'/'. random($fonts), $char2);
  116. imagettftext($image, 28, -35, 55, 37, random($colors), ABSPATH .'/'. random($fonts), $char3);
  117. imagettftext($image, 28, 25, 100, 37, random($colors), ABSPATH .'/'. random($fonts), $char4);
  118.  
  119. /*
  120.     FIN : ENVOI DE L'IMAGE
  121. ////////////////////////////// */
  122.  
  123. /*
  124. Comme c'est le fichier image.php et non captcha.png qui va être appelé,
  125. on envoie un en-tête HTTP au navigateur via header() pour lui indiquer
  126. que image.php est bien une image au format PNG. */
  127. header('Content-Type: image/png');
  128.  
  129. /* .. et on envoie notre image PNG au navigateur. */
  130. imagepng($image);
  131.  
  132. /* L'image ayant été envoyée, on libère toute la mémoire qui lui est associée via imagedestroy(). */
  133. imagedestroy($image);
  134. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement