CodeIgniter – Usando Captcha

CodeIgniter – Usando Captcha

Pra quem já conhece o framework PHP Code Igniter, esta dica pode ser interessante e muito útil. Vamos ver como usar um plugin no Code Igniter, particularmente o plugin Captcha, que são aquelas imagens de segurança em formulários.

O wiki do CI (CodeIgniter) mostra o plugin e uma possível implementação neste link: http://codeigniter.com/wiki/captcha/

Vou mostrar aqui como fazer este plugin funcionar, e de quebra explicar alguns pontos importantes para que você possa fazer as adaptações necessárias ao seu projeto.

Os plugins podem estar em dois diretórios:

system -> plugins
system -> application -> plugins

O code igniter irá procurar primeiro na pasta “system->application->plugins” e se não encontrar irá procurar no diretório “system->plugins“. E como saber que pasta utilizar? Fácil. Se você tiver um plugin que deve e/ou pode ser usado por vários sistemas, então utilize a pasta “system->plugins“. Agora se é um plugin muito específico para determinado projeto e que não terá utilidade para outros projetos, deixe dentro da pasta “system->application->plugins“. Isso não é regra, e sim uma recomendação.

O plugin do Captcha já vem com a instalação do Code Igniter, você não precisa baixar nem instalar, apenas utilizar.

E para utilizar você precisar preparar o terreno. Ou seja, verificar alguns pontos importantes para o bom funcionamento deste plugin.

Primeiro, você precisa criar uma tabela na sua base de dados que irá armazenar os diversos captchas gerados. Para futuras consultas e comparações. A não ser que você decida fazer isso utilizando a sessão do usuário.

CREATE TABLE captcha (
    captcha_id bigint(13) unsigned NOT NULL auto_increment,
    captcha_time int(10) unsigned NOT NULL,
    ip_address varchar(16) default '0' NOT NULL,
    word varchar(20) NOT NULL,
PRIMARY KEY (captcha_id),
KEY (word)
)

Veja que a tabela irá armazenar informações como, a palavra captcha gerado, o ip do usuário e o tempo de expiração do captcha. Sim, o captcha expira, assim não precisa se preocupar com o tamanho da tabela, pois ela será limpa a cada consulta.

Segundo ponto importante para o funcionamento do plugin é habilitar a biblioteca GD. Veja isso no seu arquivo php.ini na pasta de instalação do seu php.

Terceiro ponto importante, você deve criar uma pasta na sua aplicação para armazenar as imagens geradas dinâmicamente pelo captcha. Dê o nome que quizer, mas lembre-se de deixar a pasta com permissão de escrita.

Feito isso vamos utilizar o plugin.

No seu controller, que irá chamar sua view que contem o formulário, você deve gerar a imagem do seu captcha. Pra isso vamos importar o plugin, vou mostrar como fiz, existem várias formas de importar plugins. Depois vamos configurar o captcha e chamar o método do plugin que irá gerar a imagem. Salvamos as informações no banco de dados e enviamos para sua view as informações. Simples assim, veja como fica no seu controller:

function index() {
    //chama plugin de captcha - seguranca de formulario
    $this->load->plugins('captcha');

    //configura o captcha
    $expiration = time()-300; //Duas horas em milisegundos
    $this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);  //limpa o banco
    $vals = array(
            //'word'      => 'Random word',
            'img_path'    => './system/application/public/img/uploads/',
            'img_url'     => base_url().'/uploads/',
            //'font_path' => './system/fonts/texb.ttf',
            'img_width'   => '200',
            'img_height'  => '50',
            'expiration'  => '3600'
        );
    $cap = create_captcha( $vals );
    $data['image'] = $cap['image']; //imagem q vai pra tela
    $datac = array(
            'captcha_id'    => '',
            'captcha_time'  => $cap['time'],
            'ip_address'    => $this->input->ip_address(),
            'word'          => $cap['word']
        );
    $query = $this->db->insert_string( 'captcha', $datac );
    $this->db->query( $query );

    $this->load->view( 'welcome_view', $data );
}

O código não é difícil de ler, então vou explicar apenas alguns pontos interessantes.

A linha comentada: ‘word’ => ‘Random word’,

Você pode querer informar a palavra que o captcha irá gerar na imagem, neste caso informe neste campo “word“. Se não informar ele irá gerar uma imagem com palavras e números aleatórios, de 8 caracteres.

A linha: ‘img_path’ => ‘./system/application/public/img/uploads/’,

Neste caso eu criei o diretório “public/img/uploads” para armazenar as imagens geradas pelo captcha. Mas você pode criar o diretório na raiz do sistema e colocar apenas “./imagens” se desejar.

Outra linha comentada é: ‘font_path’ => ‘./system/fonts/texb.ttf’,

Se você deixar comentado ele irá usar a fonte padrão, ou você pode especificar o tipo de fonte, apenas não esqueça de colocar a fonte no diretório.

Acredito que o restante do código esteja bem fácil de entender, afinal ele apenas coloca a imagem em uma variável que vai para a tela e salva as informações no banco de dados.

Se não salvar, verifique se criou a tabela conforme descrito acima, e se seu arquivo conf -> database.php está configurado corretamente para acessar a tabela.

No seu arquivo “welcome_view.php” que você chamou para exibir o formulário, para exibir a imagem do captcha basta apenas informar a variável valorizada no controller.

<html>
<body>

<h1>formulario com captcha</h1>
    <form method="POST" action="<?=site_url('verifica_captcha')?>">
        <?=$image?> <br>
        <input type="text" name="txt_captcha" id="txt_captcha" value="">
        <input type="submit" value="enviar">
    </form>

</body>
</html>

Dessa forma quando for clicado em “enviar” ele irá chamar seu controller “verifica_captcha” enviando os dados digitados no formulário. Vejamos como fica:

function index() {
    $captcha = $this->input->post("txt_captcha");
    $ip = $this->input->ip_address();
    $tempo = time()-600;

    $sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
    $binds = array( $captcha, $ip, $tempo );
    $query = $this->db->query( $sql, $binds );
    $row = $query->row();

    if ( $row->count == 0 ) {
        //$this->validation->set_message('_captcha_check', 'Codigo de controle nao e valido');

        echo 'captcha incorreto';
    } else {
        echo 'captcha verificado com sucesso';
    }
}

Veja que no código acima é recuperado os dados do formulário, o ip e o tempo de expiração, para poder fazer a consulta no banco. Se encontrar algum resultado na tabela então o captcha foi digitado corretamente. Aqui no exemplo eu apenas conclui com um “echo” de mensagem, mas você com certeza irá utilizar de outra forma, chamando uma nova página de sucesso ou retornando a mesma página com alguma mensagem de erro.

E esta feito, a primeira vez pode dar trabalho, pois é preciso preparar o terreno, mas depois fica mais fácil, veja que em 3 etapas o processo está concluido. Basta apenas criar, mostrar e recuperar para validar.

Sucesso!



Sobre o Autor

MarioSAM é faixa preta 2Dan de Taekwondo. Entusiasta do marketing online. Especulador do mercado financeiro. Projetista web com certificação SCJP da SUN. Com 10 anos de experiência em desenvolvimento de sistemas.