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:
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:
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.