Honeypot: Captcha Acessível Sem Utilização de Imagens

Captcha Acessível Sem Utilização de Imagens

Neste meu antigo post eu mostrei como usar algumas técnicas de Captcha envolvendo imagens. O grande problema disso está no quesito acessibilidade. Leitores de tela não identificam as imagens, dificultando a navegação para deficientes visuais.

Outro problema é o incômodo para o usuário. Ele precisa identificar caracteres distorcidos em uma imagem, para provar que não é um robô. Isso é muito chato.

Há poucos meses, o Google anunciou uma nova forma de verificação anti-bot, para substituir o reCaptcha, propriedade da empresa. A abordagem é bem simplista, mas ainda envolve uma ação do usuário.

Neste post vou mostrar a técnica Honeypot, que eu uso há alguns anos e que tem dado resultados de praticamente 100% contra spam. E o melhor: não requer ação alguma do dos usuários.

Como Funciona Esse Captcha Honeypot

O “segredo” são campos ocultos. Só isso.

Explicando melhor: eu crio dois campos ocultos. Um deles é um campo input do tipo hidden (oculto). O outro é um input text (texto) oculto via CSS. Ambos possuem o valor vazio.

Ou seja, ambos os campos são invisíveis a usuários comuns. Consequentemente, não serão preenchidos por eles. Caso algum desses campos possua um valor não vazio, significa que o formulário foi enviado por um robô.

Exemplo do Captcha Honeypot em Ação

Para exemplificar, vamos criar este formulário:

<form action="seu_script.php" method="post">
  <input name="nome" type="text" placeholder="Nome"> 
  <br>
  <input name="cidade" type="text" placeholder="Cidade"> 
  <br>
  <input name="check_1" type="hidden" value="">
  <input style="position: absolute; width: 1px; top: -5000px; left: -5000px;" name="check_2" type="text">
  <br>
  <input type="submit" value="Enviar">
</form>

Na página que recebe o formulário (aqui chamei de seu_script.php), faremos o seguinte:

<?php 
$nome = isset( $_POST['nome'] ) ? $_POST['nome'] : null; 
$cidade = isset( $_POST['cidade'] ) ? $_POST['cidade'] : null;  
$check_1 = isset( $_POST['check_1'] ) ? $_POST['check_1'] : null;  
$check_2 = isset( $_POST['check_2'] ) ? $_POST['check_2'] : null;  
 
if ( ! empty( $check_1 ) || ! empty( $check_2 ) ) 
{
     echo "Você é um robô!";
     exit;  
} 
 
printf( "Nome: %s | Cidade: %s", $nome, $cidade );
?>

O código HTML tem dois campos ocultos. Ambos com valor vazio. No script PHP, verificamos se ambos são vazios. Se algum deles tiver valor diferente de vazio, exibimos uma mensagem de alerta e interrompemos o script.

Pronto. Bem simples. :)

Conclusão

Para mim, essa abordagem tem eficácia de praticamente 100%. Pouquíssimos robôs passaram por essa verificação.

A melhor coisa dessa técnica é o não envolvimento do usuário. Ele não precisa identificar caracteres em imagens nem clicar em checkbox dizendo “Não sou um robô”.

A lógica aqui é assumir primeiro que o visitante não é um robô. Ao contrário das outras, que primeiro assumem que é um robô e, para provar o oposto, o usuário é forçado a tomar alguma ação.

 

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.