Zend Captcha: eu robô? Comment

0:23 on 6 de julho de 2011 by Adriano Alves , , ,

Yay, bom estar de volta!
Captcha. Abreviação para “Completely Automated Public Turing test to tell Computers and Humans Apart”. Numa tradução livre, quer dizer “teste público totalmente autômato para testar se você é um ser humano ou uma máquina”. Consiste numa técnica para validar o preenchimento de formulários da web somente por seres humanos. Por quê somente por humanos? Um site ou aplicação residente na web está sujeito a muitas visitas, inclusive a de robôs, não do tipo humanóide, como no filme “Eu, robô”, inspirado no livro de Isaac Asimov e filme estrelado por Will Smith. Esses robôs têm diversas funções, que vão desde a indexação do seu site (Yahoo Slurp, Googlebot etc) em sites de busca até mesmo tentativas de invasão e roubo de dados privados (senhas, dados pessoais, transações financeiras) entre outros. Hoje vamos aprender a prevenir duas dessas maracutaias: o cadastro de usuários falsos e comentários feitos por spammers anunciantes de quinquilharias e coisas que você não vai precisar usar agora, talvez depois dos quarenta.

O código apresentado por Zend Captcha é um tanto simples e repleto de opcionais para customizar o nível de complexidade.
Presume-se que este código está dentro da Action de um Controller, chamaremos de “indexAction”.

$captcha = new Zend_Captcha_Image(); // Este é o nome da classe, no secrets...
          $captcha->setWordlen( 2 ) // quantidade de letras, tente inserir outros valores
                  ->setImgDir( APPLICATION_PATH. '/../public/img/captchas')// o caminho para armazenar as imagens
                  ->setGcFreq(10)//especifica a cada quantas vezes o garbage collector vai rodar para eliminar as imagens inválidas
                  ->setExpiration(10)// tempo de expiração em segundos.
                  ->setHeight(35) // tamanho da imagem de captcha
                  ->setWidth(200)// largura da imagem
                  ->setLineNoiseLevel(1) // o nivel das linhas, quanto maior, mais dificil fica a leitura
                  ->setDotNoiseLevel(1)// nivel dos pontos, experimente valores maiores
                  ->setFontSize(15)//tamanho da fonte em pixels
                  ->setFont('/usr/share/fonts/truetype/freefont/FreeSansBold.ttf'); // caminho para a fonte a ser usada
          $this->view->idCaptcha = $captcha->generate(); // passamos aqui o id do captcha para a view
          $this->view->captcha = $captcha->render( $this->view ); // e o proprio captcha para a view

Configurar estas opções é mais do que suficiente para exibirmos a imagem do captcha na view:

      
      <img src="/img/captchas/<?php echo $this->idCaptcha; ?>.png" alt="captcha" />
      

      

Com estes trechos de código, é possível inserir captcha numa view. Mas espere, ainda falta a validação!
Insira esta parte na Action para onde o formulário é submetido

if( $this->getRequest()->isPost() )
    {
      // caso o post seja valido e com um captcha
      if ( isset( $_POST['captcha'] ) )
      {
        $captcha = new Zend_Captcha_Image();// instancia novamente um captcha para validar os dados enviados
        if ( $captcha->isValid( $this->getRequest()->getParam( 'captcha' ) ) )
        {
           ...codigo...
        }
        else
        {
           ...codigo...
        }
      }
      else
      {
         ...codigo...
      }
    }

Agora temos um cenário completo para usarmos o captcha de imagem numa aplicação Zend.
Além do Captcha de Imagem, existem outros adapters, você pode conferir na Documentação Oficial do Zend.
Dúvidas, sugestões? Envie-me um email ou siga-me no twitter. Até a próxima!

Leave a Reply

Have something to say? Jump right in!     Formatting

(required)
(required)

Close

Formatting Your Comment

The following XHTML tags are available for use:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

URLs that start with http:// are automatically converted to hyperlinks.


one + = 2