Feed e Twitter

Feed RSS Twitter

Busca

Por Lustosa em 12/04/2009 às 01:06

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.

Como funciona na teoria?

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.

Mas e na prática?

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

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.

Criando o form com a imagem

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.

A checagem no backend

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.

Outras opções

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:

CAPTCHA - Exemplo 1
CAPTCHA - Exemplo 2
CAPTCHA - Exemplo 3

Como já dito, a classe suporta muitas outras opções, o melhor mesmo é ler a documentação caso se deseje customizar mais.

Artigos relacionados

Arquivado em programação, tutorial

Feed RSS para os comentários deste artigo.


9 comentários em “Criando CAPTCHAs em PHP”

  1. Anderson comentou:

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

  2. Bruno Lustosa comentou:

    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

  3. Anderson comentou:

    Boom… Nãao entendi muito bem (sou jovem [15 anos] e iniciante no PHP)…

    Mas obrigado Bruno, por estar ajudando ;D

    Ótimo bloog, :D

  4. Humberto comentou:

    Não tive problema algum, e ainda alterei alguns atributos no momento da geração.

    Excelente explicação.

    Parabéns!

  5. André comentou:

    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/

  6. MARCELO comentou:

    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.

  7. Selis comentou:

    Muito obrigado, achei muito bom, fácil e prático!

  8. Lucas Tomkiel comentou:

    Creio eu que existem formas muito mais simples para fazer praticamente a mesma coisa. Mas mesmo assim, ótima postagem, Parabéns !

  9. Bruno Lustosa comentou:

    Oi, Lucas. Realmente hoje em dia tem formas bem mais simples, mas lembre-se que postei esse artigo tem quase 3 anos, e lá atrás, não se tinham tantas alternativas como hoje.
    Um abraço!


Copyright 2009 Ataraxia!   Sinopse