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.

 

Aprenda Ainda Mais

15 Dicas, Boas Práticas e Fundamentos do PHP

Conheça Dicas FUNDAMENTAIS para programar em PHP de forma Profissional

Não se considere Programador PHP sem antes ler este guia e adotar estas práticas!

Baixe gratuitamente este guia com 15 Dicas de PHP

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.
  • Marcel

    Beraldo,
    Bom dia!

    Já criei robôs usando o cURL e acho que tem dois pontos a ser observado:

    Uso do Captcha – Dificulta para o usuário, mas tambem na fabricação do robô, não que seja impossivel de quebrar, por que isso não é.

    Uso dos campos “hidden” – Para o Usuário transparência, mas para o robô se ele faz a implementação de um POST, fica até mais fácil, já fiz inumeros com os campos de viewstate, eventvalidation e até com NULL como parametro.

    A diferença que encontro entre os dois é o tempo de execução, um robô com captcha leva no minimo mais de 15s e um sem captcha leva no minimo 400ms, falando de forma geral.

    Existe tambem casos em que se tem as duas condições, estes requisitos de segurança, acho que barram robôs mais “fracos”, mas se você tiver algo mais “inteligente” e que quebre um padrão, já vi “alguns casos” apelarem para o bloqueio de IP de origem do robô, mas ai houve solução, quando se tem um firewall e cria um esquema de alteração de IP a cada certo tempo.

    Gosto dos seus posts, parabéns continue com o bom trabalho.

    Grato,

    • Vitor

      Pra falar verdade, não entendi nada que voce disse.

    • Matheus

      Também não entendi.