CAPTCHA em PHP na prática

CAPTCHA é o acrônimo para Completely Automated Public Turing Test To Tell Computers And Humans Apart (teste de Turing público completamente automatizado para distinguir computadores e humanos).

Originalmente desenvolvido pela universidade do Carnegie-Mellon, é um tipo de teste de pergunta-resposta usado em conjunto com formulários para determinar se o usuário é humano. Entre outras coisas, isso pode evitar que scripts também conhecidos como robôs possam acessar determinadas partes de um website e colher informações em alta velocidade.

Exemplo de um CAPTCHA

Quando usar CAPTCHAs?

Os CAPTCHAs também podem ser aplicados para limitar o acesso automatizado à blogs e fóruns que sofrem com anúncios, propagandas e vandalismo, a fim de evitar ataques provenientes de robôs e para impor rate limit. Outra aplicação inteligente é impedir que placares de votações on-line sofram ação de robôs.

Implementar um CAPTCHA pode ser um grande desafio, pois trata-se de uma tecnologia que envolve manipulação de imagens com foco em segurança. Em princípio pode parecer simples afinal o processo básico se baseia em:

  1. Estampar uma string sob um fundo preferencialmente colorido, esse fundo pode ser até mesmo uma imagem previamente editada.
  2. Mover alguns pixels da figura de forma que ela se torne diferente da original. Basicamente isso pode ser obtido movendo algumas linhas e colunas 2 ou 3 pixels para qualquer lado.
  3. Exibir a imagem num formulário.
  4. Testar se a string digitada pelo usuário é igual a originalmente usada para criar a figura.

O processo aparentemente simples se torna complexo no momento em que é necessário o uso de algoritmos matemáticos complexos para criação de imagens muito destorcidas e ainda assim legíveis para o olho humano.
Isso é necessário, pois atualmente existem softwares capazes de interpretar via OCR o texto dos CAPTCHAS.

Como Implementar um CAPTCHA?

Neste artigo usaremos o freeCap, um bem sucedido projeto de CAPTCHA que já faz muito além do que foi originalmente idealizado.

O freeCap foi criado por Howard Yeend em meados de 2004 e já está na versão 1.4.1. Desde que o desenvolvedor iniciou o projeto, o freeCap ganhou novas funcionalidades como rate-limit, um extenso dicionário de palavras e também mais estabilidade.

As imagens CAPTCHA exibidas pelo freeCap são originalmente baseadas em um dicionário de palavras da língua inglesa, porém é possível alterar esse dicionário de palavras, ou até mesmo desativa-lo, onde serão exibidas strings aleatórias na imagem.

Usar uma implementação pronta de um CAPTCHA tem seus prós e contras:

Vantagens:

  • Um produto já pronto, testado e funcional.
  • Quando necessário correções são feitas pelo desenvolvedor.
  • Funcionalidades adicionais podem ser implementadas pelo desenvolvedor do produto.
  • Os algorítimos usados são avançados e difíceis de serem trapaceados.

Desvantagens:

  • Podem haver backdoors no código do programa.
  • O desenvolvedor pode simplesmente parar o projeto e não haver mais atualizações do programa.
  • Pelo fato de usar um programa popular, uma falha descoberta colocará todos utilizadores do programa em risco

Estrutura do freeCap

O freeCap é composto pelos seguintes arquivos:

  • COPYING.txt – licença GNU versão 2;
  • freecap.php – núcleo do freeCap;
  • freecap_wrap.php – formulário de teste e demonstração;
  • .ht_freecap_font1.gdf – fontes;
  • .ht_freecap_font2.gdf – fontes;
  • .ht_freecap_font3.gdf – fontes;
  • .ht_freecap_font4.gdf – fontes;
  • .ht_freecap_font5.gdf – fontes;
  • .ht_freecap_im1.jpg – imagem;
  • .ht_freecap_im2.jpg – imagem;
  • .ht_freecap_im3.jpg – imagem;
  • .ht_freecap_im4.jpg – imagem;
  • .ht_freecap_im5.jpg – imagem;
  • .ht_freecap_words – dicionário.

Não confunda os arquivos fontes com arquivos com códigos fonte. Esses arquivos possuem as características básicas dos formatos dos caracteres que serão exibidos na imagem.

Os arquivos com imagens são usados para criar imagens de fundo.

Como já mencionado o arquivo de dicionário pode ter seu conteúdo substituído por outras palavras, porém em muitos casos é recomendo que o dicionário não seja usado, a menos que ele seja excessivamente grande a ponto de uma palavra quase nunca ser repetida. O uso de palavras pré definidas (dicionário) pode abrir precedentes para que um robo consiga obter todo conjunto de palavras possíveis e dessa forma o CAPTCHA perderá sua funcionalidade.

Os primeiros passos

Para começar o trabalho com o freeCap, realize o seguinte procedimento:

  1. Faça download do freeCap em:
    http://www.puremango.co.uk/freecap1.4.1.zip
  2. Descompacte o arquivo no diretório de trabalho do seu servidor web:
    $ unzip freecap1.4.1.zip
  3. Teste o funcionamento acessando o arquivo freecap_wrap.php, deverá ser exibido o seguinte formulário:
    Formulário de exemplo do freeCap (freecap_wrap.php)

    Se a imagem do CAPTCHA não aparecer é um forte indício que o módulo GD do PHP não está instalado corretamente.

Com esses primeiros passos o leitor já está um pouco familiarizado com o freeCap, basta agora entendermos a estrutura desse formulário de exemplo para que seja possível customiza-lo e aplicar o freeCap aos seus formulários já existentes.

Customizando o script

Vamos entender algumas variáveis importantes do script freecap.php, os valores padrão das variáveis serão destacados com sublinhado:

  • $output: Formato em que o CAPTCHA será gerado, os tipos suportados são jpg, png e gif.
  • $use_dict: Define o uso do dicionário, isso é feito com os números booleanos 0 e 1.
  • $dict_location: Define o arquivo de dicionário com caminho completo, por exemplo: ./.ht_freecap_words.
  • $max_word_length: Define o número de caracteres que será usado na geração de strings atórias, ou seja, quando o dicionário não for usado. O valor padrão é 6.
  • $col_type: Define se todos caracteres terão a mesma cor (0) ou se cada um terá uma cor diferente (1).
  • $max_attempts: Númeo de tentativas para acertar a string (20).
  • $bg_type: 0=transparent (valido somente para png e gif); 1=branco com uma grade de fundo; 2=branco com linhas emaranhadas de fundo; 3=Fundo com quadrados mistos.
  • $morph_bg: Quando true realiza uma distorção da imagem de fundo, quando false a imagem de fundo fica mais linear.
  • $tag_str: Contem a string que será exibida na imagem o valor padrão é freeCap v1.41 – puremango.co.uk e é extremamente recomendável que essa variável seja alterada num ambiente de produção, podendo ser setada para null caso não tenha a intenção de exibir uma string desse gênero na imagem.

Referências

Livro: Segurança em PHP

Website: pureMango (página do desenvolvedor do freeCap – Howard Yeend)

Observações

Este artigo é um texto complementar ao livro Segurança em PHP, publicado pela Novatec Editora.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

One thought on “CAPTCHA em PHP na prática”

%d bloggers like this: