Um problema comum para quem fornece um formulário de contato ou disponibiliza algum sistema de comentário em um site é o aumento de spam enviados por bots(robos) que lêem os campos do formulário e enviam as informações de spam via POST.

Uma maneira muito comum de se proteger deste tipo de ataque é diferenciar se quem está enviando as informações é uma pessoa ou um bot. Isso pode ser feito criando um código que seja de fácil leitura para o usuário humano e difícil para máquinas e pedir para o usuário digitar este código junto com as outras informações do formulário.

Este sistema é muito comum hoje em dia e recebe o nome de CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Humans Apart ou Teste Público Totalmente Automatizado para Diferenciar Humanos de Computadores) e vamos agora apreender com fazer um simples.

Começaremos criando uma imagem com um fundo um pouco bagunçado, quanto mais bagunçado melhor, isso dificulta a leitura por bots.

O CAPTCHA vai funcionar da seguinte forma, vamos gerar um código baseado na hora do sistema e armazená-lo em uma sessão, após isso iremos criar uma imagem com o fundo que criamos acima e escrever o nosso código gerado sobre ele.

Vamos então aos código

session_start();
 
$codigoCaptcha = substr(md5( time() ) ,0,9);
 
$_SESSION['captcha'] = $codigoCaptcha;
 
$imagemCaptcha = imagecreatefrompng("fundocaptch.png");
 
$fonteCaptcha = imageloadfont("anonymous.gdf");
 
$corCaptcha = imagecolorallocate($imagemCaptcha,255,0,0);
 
imagestring($imagemCaptcha,$fonteCaptcha,15,5,$codigoCaptcha,$corCaptcha);
 
header("Content-type: image/png");
 
imagepng($imagemCaptcha);
 
imagedestroy($imagemCaptcha);

Na linha 3 geramos nosso código “aleatório” começamos pegando o timestamp através da função time e aplicamos sobre ele a função md5 deste código md5 pegamos os 9 primeiros caracteres(se você quiser pode pegar mais ou menos) através da função substr.

Na linha 5 salvamo nosso código na sessão para que possamos compará-lo mais tarde.

Na linha 7 criamos uma imagem a partir da imagem de fundo que criamos.

Na linha 9 carregamos uma fonte através da função imageloadfont que carrega define a fonte que será utilizada para escrever nosso código de captcha na imagem criada na linha 7.

Na linha 11 utilizamos a função imagecolorallocate para gerar uma cor para o código que iremos inserir na imagem.

Na linha 13 utilizamos a função imagestring para “desenhar” o código gerado na linha 3 na imagem criada na linha 8, utilizando a fonte definida na linha 9.

Na linha 15 mudamos o cabeçalho do arquivo para ele ser um arquivo do tipo imagem no formato png, isso faz com que o navegador mostre a imagem e não o código binários em forma de texto.

Na linha 17 enviamos a imagem gerada para o navegador. Na linha 19 desalocamos o espaço utilizado pela imagem criada.

Para utilizar o captcha precisamos de um formulário e dentro dele exibiremos a nossa imagem através da tag IMG e também precisaremos de um campo para o usuário inserir o código captcha.

<form action="valida.php" method="post">
    <img src="captcha.php" alt="código captcha" />
 
    <label for="captcha">Digite o código</label>
    <input id="captcha" name="captcha" type="text" />
    <input type="submit" value="Enviar" />
</form>

Agora basta compara o valor passado por POST no input captcha com o valor armazenada em sessão.

if( $_SESSION['captcha'] == $_POST['captcha']){
    echo "<h1>Ok - Código Correto</h1>";
}else{
    echo "<h1>Erro - Código digitado errado</h1>";
}

Aqui você pode visializar o exemplo

Download do exemplo.