Após postar a galeria dos 10 piores CAPTCHAs do mundo, estou postando o artigo prometido sobre como criar um CAPTCHA em PHP.
Como já dito antes, a função de um CAPTCHA é apresentar um problema de fácil solução para um ser humano, mas de difícil resolução por um computador. Normalmente, os CAPTCHAs tomam a forma de imagens com letras distorcidas, e é exatamente este o tipo que iremos criar neste artigo.
O funcionamento de um CAPTCHA de letras tortas é bem simples. O servidor gera uma string que será transformada em uma imagem. A string é salva em algum lugar (normalmente em uma variável de sessão). A imagem é apresentada dentro de um formulário. Ao submeter o formulário, o script checa se o que o usuário digitou bate com o conteúdo da variável de sessão. Se bater, o usuário passou no teste.
Na teoria, tudo muito simples.
Na prática, tudo também pode ser igualmente simples. Ao invés de reinventar a roda, podemos utilizar uma classe chamada Securimage, que serve justamente para gerar CAPTCHAs.
Securimage é uma classe em PHP que utiliza a biblioteca gráfica GD para gerar imagens com CAPTCHAs. A classe é bastante versátil, e suporta várias opções, como fontes TTF, imagens de fundo, linhas, arcos e bem mais.
O primeiro passo é baixar o pacote com a versão mais recente e descompactá-lo em algum lugar. A partir deste ponto, vou assumir que o pacote foi descompactado em uma pasta chamada “securimage” no diretório raiz do site.
Dentro do formulário que se deseja proteger, colocamos uma tag img, que irá conter a imagem gerada pelo Securimage:
<img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA" />Este script securimage_show.php é bem pequeno (3 linhas), e irá criar um CAPTCHA com as opções padrões da classe. Veremos mais adiante algumas formas de se customizar a imagem.
Além da imagem, também precisamos de um campo para o usuário digitar as letras contidas na imagem:
<input type="text" name="captcha_txt" />E com isso o formulário está pronto.
O usuário viu a imagem, digitou os dados e submeteu o formulário. Agora é hora de checar se o código digitado bate com o texto contido na imagem.
Logo no início do script que recebe os dados do formulário (em caso de dúvida, veja o atributo action da tag form), é preciso inicializar as variáveis de sessão:
<?php session_start(); ?>
É importante que este código venha antes de qualquer saída, ou teremos um erro do tipo “Cannot modify header information – headers already sent….”. Na dúvida, coloque logo no início.
O restante da checagem é bastante simples. Basta instanciarmos um objeto da classe Securimage e chamar um método que faz a checagem:
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php'; $securimage = new Securimage(); if ($securimage->check($_POST['captcha_txt'])) { // Código digitado corretamente die("Ok, o código foi digitado corretamente."); } else { // Código digitado não bate com a imagem die("Erro: código incorreto."); } ?>
O exemplo acima apenas ilustra como é feita a checagem. As chamadas a die() devem ser substituídas de acordo com a lógica da página onde o CAPTCHA está sendo inserido. No caso do código estar correto, deve-se prosseguir com o processamento do formulário, e caso não esteja, possivelmente exibir novamente o formulário com uma mensagem de erro. Será gerado um novo CAPTCHA automaticamente.
Como dito anteriormente, a classe é bastante versátil, e suporta diversas opções para a geração das imagens. Todas as opções estão descritas na documentação da classe, mas vou transcrever várias das opções aqui.
Para se customizar a imagem, basta editar diretamente o script securimage_show.php, que é o script usado na tag img. Originalmente, ele é apenas o seguinte:
<?php include 'securimage.php'; $img = new securimage(); $img->show(); ?>
Podemos passar opções para a classe antes de chamar o método show(). Apenas para ilustrar, aqui vai um exemplo bem customizado:
<?php include 'securimage.php'; $img = new securimage(); $img->code_length = 8; // 8 ao invés de apenas 4 caracteres $img->charset = "AEIOU"; // Apenas vogais $img->image_width = 280; // Padrão é 175px para 4 caracteres $img->multi_text_color = "#ff0000,#0000ff"; // Letras azuis e vermelhas $img->image_bg_color = "#ffff00"; // Fundo amarelo $img->show(); ?>
E abaixo, 3 exemplos de CAPTCHAs gerados por este script:
![]()
![]()
![]()
Como já dito, a classe suporta muitas outras opções, o melhor mesmo é ler a documentação caso se deseje customizar mais.
Feed RSS para os comentários deste artigo.
July 25th, 2009 às 23:22
Bom… Do jeito q foi explicado não consegui :S
Então, no script que recebe os dados do formulário, vc’s disseram pra fazer assim:
[...]
require_once $_SERVER['DOCUMENT_ROOT'] . ‘/securimage/securimage.php’;
[...]
Dessa maneira não consegui, então, troquei por:
[...]
require_once ‘/securimage/securimage.php’;
[...]
E deu certo
July 26th, 2009 às 18:26
Oi, Anderson.
Provavelmente alguma configuração específica do seu servidor, pois o DOCUMENT_ROOT aponta para o caminho físico da raiz da aplicação web. Se você conseguiu carregar o securimagem da forma que colocou, ou você o colocou na raiz do servidor, ou o seu servidor está fazendo a tradução de caminhos, e apontando a raiz para onde ele está.
De qualquer forma, que bom que conseguiu colocar pra funcionar.
[]s
July 28th, 2009 às 23:59
Boom… Nãao entendi muito bem (sou jovem [15 anos] e iniciante no PHP)…
Mas obrigado Bruno, por estar ajudando ;D
Ótimo bloog,
July 29th, 2009 às 13:09
Não tive problema algum, e ainda alterei alguns atributos no momento da geração.
Excelente explicação.
Parabéns!
August 27th, 2009 às 09:46
Eu tambem postei um tuto sobre captcha, se quiser dar uma conferida.
http://www.gasparimsat.com/index.php/13/05/2009/criar-um-captcha-com-o-php/
June 29th, 2011 às 14:58
O MELHOR ARTIGO DE CAPTCHA QUE EU LI ATÉ HJ, FUNCIONA PERFEITO, PARABENS!!
OBS: FAÇA UM ARTIGO PARA COLOCAR O BOTÃO DE LOGIN DO FACEBOOK NO SITE, PARA QUE O USUÁRIO FAÇA LOGIN NO MEU SITE ATRAVÉS DO BOTÃO DE CONNECT DO FACEBOOK.
January 17th, 2012 às 12:40
Muito obrigado, achei muito bom, fácil e prático!