Classe para gerar captcha

Se no seu site ou blog existe um formulário de comentários ou mesmo um de contato você provavelmente já sofreu alguma vez com os famosos spams que são enviados automaticamente por robôs (bots), poluindo assim, a sua caixa de entrada ou banco de dados.

Uma forma de se combater esses bots que são programados para ficar executando seus formulários de maneira automática é o CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart), que é uma técnica de verificação exatamente para distinguir humanos de máquinas.

Essa verificação consiste em exibir nos formulários uma imagem distorcida gerada aleatoriamente com alguns caracteres onde o usuário deve preencher um campo de texto informando esses caracteres, caso contrário o formulário não será submetido. Com isso conseguimos evitar quase que 100% a ação dos bots.

Certo. Agora que entendemos um pouco a funcionalidade do CAPTCHA, vamos à uma forma fácil de implementação dessa técnica em nossos formulários.

Para isso utilizaremos a classe Captcha, que pode ser baixada nesse link.

Após baixar e descompactar os arquivos você perceberá a seguinte estrutura de diretórios/arquivos:

Note que temos 3 diretórios e 1 arquivo (captcha.php) na raiz do nosso diretório. No diretório class estão as classes que geram os captchas. Em fonts estão as fontes que os caracteres serão gerados. Já temos a fonte arial mas sinta-se à vontade para adicionar nesse diretório outras fontes de sua preferência. Em gfx tem uma imagem padrão que será exibida caso a imagem do captcha não possa ser gerada por algum motivo. Por fim, o arquivo captcha.php tem como objetivo criar uma instância da classe Captcha e armazenar os caracteres em uma sessão.

Agora iremos criar na raiz mais 2 arquivos: o index.php e o verifica.php. O primeiro será a página onde o formulário estará implementado e o segundo é onde verificamos se o captcha foi digitado corretamente.

Arquivo index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
    <head>
        <title>Implementando Captchas</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <h1>Implementando Captchas</h1>
        <form name="form1" method="post" action="verifica.php">
            <img src="captcha.php" alt="captcha" />
            <br />
            <input type="text" name="captcha" />
            <input type="submit" value="Enviar" />
        </form>
    </body>
</html>

Crio um formulário html com a action definida para o arquivo verifica.php e nele coloco uma imagem cuja propriedade src é o arquivo captcha.php. Depois crio um campo de texto com nome captcha que é onde deverá ser digitado pelo usuário o código de verificação da imagem de captcha.

Arquivo verifica.php

1
2
3
4
5
6
7
8
9
<?php
session_start();
 
if($_POST['captcha'] == $_SESSION['captcha']){
    echo 'Verificação OK!';
}
else{
    echo 'Código incorreto';
}

Nesse arquivo eu recupero o valor do campo captcha do formulário que veio via post e verifico se ele é igual à sessão criada lá no arquivo captcha.php. Se forem iguais significa que o código está correto. Caso contrário a verificação falha.

Cabe a você agora incrementar esses scripts de acordo com suas necessidades.

Espero que lhe seja útil

Abs

Siga-me no twitter: @rafaelwendel

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. Rafael, e seu eu for colocar o captcha em uma página que já tenha um formulário de cadastro, e esse formulário de cadastro tem um php dentro, mas eu preciso que esse php rode quando o captcha for certo também. Onde eu coloco esse formulário do captcha e o que mais eu posso fazer?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *