em

Como criar uma imagem captcha simples com PHP

BotDetectSe você tem campos com formulários públicos em seu site (contatos, comentários, guestbooks, etc.) provavelmente já recebeu massagens automáticas deixadas por spammers. Dependendo da frequência e quantidade, essas massagens podem chegar até a comprometer o desempenho de seu servidor, além de encher seu BD de lixo eletrônico.

Uma maneira eficiente de barrar esse problema  é a implementação do CAPTCHA – uma imagem com uma string gerada aleatoriamente que verifica se quem esta tentando deixar a mensagem é realmente uma pessoa.

Um CAPTCHA é um tipo de desafio-resposta, teste utilizado na computação para determinar se o usuário é humano, CAPTCHA  é um acrônimo para “Completely Automated Public Turing test to tell Computers and Humans Apart” (teste de Turing público completamente automatizado para diferenciação entre computadores e humanos), registrado pela Carnegie Mellon University.

Neste artigo vamos apresentar um script PHP bastante simples, com ele vamos criar uma imagem CAPTCHA totalmente funcional a partir de funções nativas do PHP e da GD (PHP graphics library), vamos criar um arquivo a parte, chamado “captcha.php” que será responsável pela geração da imagem-teste.
Também vai ser necessário uma pequena imagem base que será usada pela função “imagecreatefromjpeg()” como base de nosso  CAPTCHA, você pode cria-lá com o MSPaint.

Vejam o Código do “captcha.php”:

   1: <?php

   2: session_start();

   3: header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

   4: header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 

   5: header("Cache-Control: no-store, no-cache, must-revalidate"); 

   6: header("Cache-Control: post-check=0, pre-check=0", false);

   7: header("Pragma: no-cache");

   8:  

   9: function gerachar($length=6)

  10: {

  11:     $_rand_src = array(

  12:         array(48,57) //números

  13:         , array(97,122) //letras maiúsculas

  14:         , array(65,90) //letras minúsculas

  15:     );

  16:     srand();

  17:     $random_string = "";

  18:     for($i=0;$i<$length;$i++){

  19:         $i1=rand(0,sizeof($_rand_src)-1);

  20:         $random_string .= chr(rand($_rand_src[$i1][0],$_rand_src[$i1][1]));

  21:     }

  22:     return $random_string;

  23: }

  24:  

  25: $img = @imagecreatefromjpeg("fundo.jpg"); 

  26: $rand = gerachar(4);

  27: $_SESSION['captcha'] = $rand;

  28: ImageString($img, 5, 5, 7, $rand[0]." ".$rand[1]." ".$rand[2]." ".$rand[3], ImageColorAllocate ($img, rand(0,255), rand(0,255), rand(0,255)));

  29: Header ('Content-type: image/jpeg');

  30: imagejpeg($img,NULL,100);

  31: ImageDestroy($img);

  32: ?>

Agora é só chamar a imagem CAPTCHA a partir de um formulário HTML:

   1: <?php session_start() ?>

   2: <form method="post" action="">

   3: <table bgcolor="#CCCCCC">

   4: <tr><th>Deixe seu recado:</th></tr>

   5: <tr><td><textarea cols="30" rows="5" name="message"></textarea></td></tr>

   6: <tr><td align="center">CAPTCHA:<br>

   7:     (Digite o código da imagem)<br>

   8:     <table><tr><td><img src="captcha.php" alt="Você é humano?"></td>

   9:     <td><input type="text" name="captcha" size="4" maxlength="4"></td></tr></table>

  10: </td></tr>

  11: <tr><th align="center"><input type="submit" value="Submit"></th></tr>    

  12: </table>

  13: </form>

  14: <?php

  15: if(isset($_POST["captcha"]))

  16: if($_SESSION["captcha"]==$_POST["captcha"])

  17: {

  18: 

  19:     echo 'Código correto, seu recado foi enviado!';

  20: }

  21: else

  22: {

  23:     echo 'Código incorreto; tente novamente...';

  24: }

  25: ?>

O “pulo do gato” de nosso código é que o mesma variável aleatória  responsável pelo criação do código  de verificação é passada pela seção PHP para ser testada.

Download do script exemplo

Gostou dessa matéria?

Inscreva seu email para receber atualizações com as últimas publicações do nosso blog.

4 opinaram!

Deixe sua opinião!
  1. Em primeiro lugar muuito obrigado pelo tutorial. Funcionou. Mas poderia me informar a linha de comando para eu fazer com quer o usuário seja direcionado para uma página de erro caso digite o código errado; e para outra página caso digite o código corretamente. Atenciosamente,
    [email protected]

    • Oi amigão, esta é a parte do script que faz a verificação:

      
      

      Se você que direcionar o usuário para uma página de erro ao invés de exibir a mensagem, basta substituir o echo por um header(“Location:erro.php”).
      T+!

Deixe o seu comentário: