Captcha Simples


Resumo
Nome: Captcha Simples
Linguagem: PHP
Autor: JRomao
Download

Diferenciar seres humanos de bots é sempre uma boa ideia para saber o que é spam e o que não é em fóruns, livros de visitas, formulários de contacto, etc...

Uma das melhores maneiras de fazer esta diferenciação é usando imagens e fazendo perguntas acerca delas.

O script em anexo, disponível para  download à direita tem o código para criar uma imagem captcha simples como a que é, por agora, usada neste site.

Este script cria uma pequena imagem com 6 caracteres em posições aleatórias. A string é guardada em sessão e pode depois ser comparada no código.

Código:

Variáveis usadas:

$cars - array com os caracteres que vão ser usados para o texto

$string - string que vai ser mostrada na imagem

$img - imagem que vai ser mostrada

$background_color e $cor_texto - cor do fundo da imagem e do texto respectivamente

Código:

1-Inicializar variáveis e a imagem. Para a lista de caracteres usa-se apenas os caracteres alfanuméricos [A-Za-z0-9] para evitar que haja caracteres a aparecer incorrectamente na imagem (o tipo de letra pode não aceitar acentos por exemplo). A string a mostrar tem de começar vazia, como é claro.

A imagem é declarada nos headers como um png, e fica com um tamanho de 120 de largura por 40 de altura, o suficiente para ter 6 letras. A cor de funda é decidida à sorte entre um espectro de cores que não dificultariam excessivamente a leitura das letras, cuja cor também é decidida aleatoriamente.

$cars = array("Q","q","W","w","E","e","R","r","T","t","Y","y",
              "U","u","I","i","O","o","P","p","A","a","S",
              "s","D","d","F","f","G","g","H","h","J","j",
              "K","k","L","l","Z","z","X","x","C","c","V",
              "v","B","b","N","n","M","m","1","2","3","4",
              "5","6","7","8","9","0");
$string = "";

header("Content-type: Image/png");
$img = imagecreate(120,40);
$background_color = imagecolorallocate($img, mt_rand(135,255),mt_rand(135,255),mt_rand(135,255));

2- Desenhar linhas aleatoriamente. Para dificultar a leitura por robots, desenham-se ainda umas quantas linhas por cima do texto. O número de linhas varia de 0 a 4 e a cor também é aleatória.

$nlinhas = mt_rand(0,4);
for ($i = 0; $i < $nlinhas; $i++) {
$cor_texto = imagecolorallocate($img,mt_rand(0,128),mt_rand(0,128),mt_rand(0,128));
imageline($img, mt_rand(0,120), mt_rand(0,40), mt_rand(0,120), mt_rand(0,40), $cor_texto);
 }

3- Definir o texto a mostrar. O script faz um ciclo que percorre 6 vezes, uma para cada caractere a colocar na imagem. Cada caractere é decidido pegando num elemento decidido aleatoriamente do array $cars sendo então colocado na imagem após ser decidida a sua cor entre um leque de cores que não dificulte a sua leitura (cores mais escuras). A sua posição é também decidida aleatoriamente estando reservado a cada caractere um espaço para evitar sobreposições. O tipo de letra usado no caractere é decidido por entre os tipos 2, 3, 4 ou 5 que já estão definidos no PHP. Cada caractere é depois adicionado à variável $string.

for ($i = 0; $i < 6; $i++) {
$cor_texto = imagecolorallocate($img,mt_rand(0,128),mt_rand(0,128),mt_rand(0,128));
$car = $cars[mt_rand(0,61)];
$string .= $car;
imagestring($img, mt_rand(2,5),mt_rand($i*20+1, $i*20+10), mt_rand(2,20), $car, $cor_texto);
}

4- Guardar a sessão, mostrar a imagem e eliminá-la. Depois de a imagem estar terminada o valor em $string é guardado na sessão, a imagem é mostrada e eliminada do servidor para não ficar a ocupar espaço.

Implementação: 

1- Passar o ficheiro para o formato '.php'

2- Certificar que as sessões estão inicializadas (session_start())

3- A imagem é inserida como uma imagem qualquer:

ex: Captcha Image!

4- Meter um campo de texto para o visitante inserir o que vê

5- No código de processamento dos dados fazer uma comparação de strings simples com a variável de sessão CAPTCHA_IMAGE

ex:

if ($_POST['captcha'] != $_SESSION['CAPTCHA_IMAGE'])
          exit("O texto inserido não corresponde à imagem!");

O resultado final será algo como a imagem abaixo:

Captcha Simples

Sugestões: 

Este script usa os tipos de letra por definição do PHP. Para tornar ainda mais complexa a leitura da imagem pode-se optar por usar um tipo de letra personalizado recorrendo à função imagettftext() em detrimento da função imagestring(). Para tal basta fazer download de uns quantos ficheiros .ttf, colocar o caminho de cada ficheiro num array e decidir qual o tipo de letra a usar por entre os elementos desse array.

JRomão | Contacto | Termos de Uso
© 2009 - 2012 JRomão

Download Opera - World's fastest and most secure Web browser.