- Como Criar Um Site, Blog – WebMaster.pt - http://www.webmaster.pt -

CAPTCHA Em PHP – Eliminar SPAM Nos Formulários

Tweet [3]

Dentre as medidas adotadas contra programas disseminadores de spams nos formulários, uma das mais efetivas é o CAPTCHA. Esta palavra estranha, na verdade é um acrônimo com algumas iniciais da frase “teste de Turing público completamente automatizado para diferenciação entre computadores e humanos”.

Apesar de caracterizados pelas imagens com letras distorcidas, os sistemas CAPTCHAs são mais do que isso. O propósito declarado é criar desafios que os programas de computadores não consigam resolver.

Quanto mais complexa a imagem, mais difícil o reconhecimento por parte do computador. Isso porque o modo como os programas leêm a imagem é separando o primeiro plano, no caso a letra, do fundo da imagem. Se não existir uma delimitação perceptível entre estes dois planos, o programa não consegue efetuar a leitura corretamente.

Neste tutorial vamos criar um script PHP que gera uma imagem com letras e que pode ser usado como verificação no formulário.

Princípio Do Funcionamento

Será gerado um texto randomicamente. Este texto ficará guardado em uma variável de sessão e também será mostrado como imagem para o visitante. Assim que o formulário for submetido, o que o visitante digitou no campo de verificação será comparado aos caracteres existentes na variável da sessão.

O Texto Da Imagem

Antes de criar o texto, é iniciada a sessão já que o texto gerado será guardado em uma variável de sessão.



session_start();
$texto_rand = md5(rand());
$caracteres = substr($texto_rand,0, 5);

$_SESSION["codigo"] = $caracteres;

Na segunda linha é gerada uma sequência aleatória de caracteres com o rand() que depois são embaralhados com o md5(). O texto gerado é composto de 32 caracteres, o que é muita letra para o nosso propósito. Utilizamos então a função substr() para retornar apenas 5 caracteres dentre os gerados.

Por fim a variável de sessão é criada e preenchida com estes cinco caracteres.

Definindo O Espaço

Vamos definir agora o tamanho que a imagem terá e as cores utilizadas.



    $largura = 100;
    $altura = 50;

    $recipiente = imagecreate($largura, $altura);  

    $vermelho = imagecolorallocate($recipiente, 240, 10, 10);
    $cinza = imagecolorallocate($recipiente, 175, 175, 175);

    imagefill($recipiente, 0, 0, $cinza);

Nós poderíamos definir o tamanho da imagem diretamente no imagecreate() que gera o retângulo, mas para fins de tornar o código mais compreensível definimos variáveis para isso.

Os caracteres serão da cor vermelha sobre fundo cinza. Utilizamos para criar as cores o imagecolorallocate() que requer uma imagem de referência e os valores RGB da cor.

Na última linha o retângulo criado na linha três é preenchido com a cor cinza.

Os Caracteres

O espaço já esta reservado, vamos adicionar o texto.



imagettftext($recipiente,30,7,15,35,$vermelho,'king.ttf', $caracteres);

A vantagem em utilizar o imagettftext() na criação do texto é que esta função permite utilizar qualquer fonte e podemos inclinar o texto.

No primeiro parâmetro da função é informado onde o texto será posto, que é no retângulo criado anteriormente. O número 30 é o tamanho do texto em pontos, o 7 a inclinação, o 15 e 35 a distância a partir do canto superior esquerdo, a cor vem em seguida, o endereço do arquivo com a fonte que será usada na escrita e por último o texto.

Duas medidas que dificultam a vida dos programas que tentam ler o conteúdo da imagem. A fonte utilizada “Kingthings Calligraphica” é rebuscada, com curvas, linhas finas e grossas. Apesar de leve, a inclinação adiciona outro fator de empecilho para os bots.

Geração Da Imagem

A imagem esta pronta, agora vamos mostrá-la na tela.



header("Content-Type: image/jpeg");

imagejpeg($recipiente);
  
imagedestroy($recipiente);

Com o header() é informado que o conteúdo da página será uma imagem do tipo JPG. O imagejpeg() mostra essa imagem e o imagedestroy() libera a memória usada na criação da imagem.

Fazendo A Verificação

Coloque o código criado em um arquivo à parte nomeado “geraCaptcha.php”. Veja o código completo:



session_start();
$texto_rand = md5(rand());
$caracteres = substr($texto_rand,0, 5);
$_SESSION["codigo"] = $caracteres;
$largura = 100;
$altura = 50;
$recipiente = imagecreate($largura, $altura);  
$vermelho = imagecolorallocate($recipiente, 240, 10, 10);
$cinza = imagecolorallocate($recipiente, 175, 175, 175);
imagefill($recipiente,0,0,$cinza);
imagettftext($recipiente,30,7,15,35,$vermelho,'king.ttf', $caracteres);
header("Content-Type: image/jpeg");
imagejpeg($recipiente);
imagedestroy($recipiente);

Na página “index.php” vamos inserir o formulário que contém a imagem de verificação.



<form action="<?php $_SERVER['PHP_SELF']?>" method="post">
<input type="text" name="campo"/>
<img src="geraCaptcha.php" /><br />
<input type="submit" value="Enviar" name="enviar" />
</form>

No elemento imagem, esta definido que a procura será feita pelo arquivo que contém o código que gera uma imagem. É estranho chamar um arquivo ‘.php’ ao invés de uma imagem ‘.jpg’ não? Mas observe a antepenúltima linha do código que gera a imagem e verá que enviamos um header do tipo ‘image/jpeg’ que significa que a saída do arquivo é uma imagem, e por extensão o arquivo é tratado como imagem também.

A ação do formulário aponta para o próprio arquivo, pois escrevemos ‘PHP_SELF’. Então acima do formulário vamos inserir algumas linhas PHP com uma simples validação para saber se o código digitado no campo do formulário confere com o da imagem.

Quando o formulário for submetido, uma variável recebe o conteúdo digitado e compara com o valor existente na variável de sessão ‘codigo’. Se os valores conferem é mostrada uma mensagem de sucesso, caso contrário um aviso.

Verificação bastante simples, sem os cuidados com segurança, mas suficiente para você entender o processo desde a criação da imagem até a validação. Agora é só personalizar e você terá formulários menos suscetíveis à ataques de programas disseminadores de spams.

Desvantagens

A desvantagem mais aparente de utilizar imagens CAPTCHA é estética. Para dificultar a ação dos programas o texto precisa ser distorcido, ou no nosso caso, como uma letra rebuscada que não deixa de ser feia.

A usabilidade também perde um pouco por exigir a digitação de mais um campo e pelas chances de erro por parte do usuário. Tornando assim o processo mais demorado.

Alternativa Javascript

Tendo em vista as desvantagens expressas acima, o pessoal da Web Design Beach desenvolveu um plugin javascript com um visual bem mais interessante que o CAPTCHA normal.

[4]

Consiste em arrastar o objeto requerido até o círculo maior. Você pode saber mais sobre o Ajax Fancy Captcha [5] neste link.

Avanços Na Área

Com o intuito de tornar os desafios mais complexos para os computadores e a utilização mais amigável para os humanos esta em desenvolvimento a tecnologia HIP (Human Interaction Proof). Ao invés de imagens com letras e textos, são mostrados objetos, animais e outras imagens para serem identificadas.

O Asirra [6] é um projeto ainda em versão beta, mas que já pode ser utilizado. Apresenta imagens de gatos e cachorros e torna a tarefa de verificação bem mais divertida para o usuário.

Conclusão

A utilização das imagens CAPTCHA como escudo contra o ataque de spammers é a forma mais comum na internet por se provar a mais eficaz nesse propósito. Você viu neste tutorial que implementar esta técnica é bastante simples em vista dos ganhos. E pelas possibilidades de personalização e autonomia ainda será utilizada por um longo tempo.

Tweet [3]
Be Sociable, Share!
  • [7]
  • [8]
  • [9]
  • [10]
  • [11]