Como criar um Honeypot simples para proteger os seus Formulários contra Spammers

Eu acho que este post será curto e útil. O objectivo aqui é demonstrar uma técnica simples para o ajudar a bloquear spammers e bots que possam atacar os formulários do seu website. Isto significava ser uma camada extra na prevenção de spam, e não o principal recurso para. Use-o com outras ferramentas como o re, etc. Devido à sua simplicidade, eu realmente recomendo que você siga este padrão de formulário, então, vamos code:

Imagine que você tem a seguinte estrutura de formulário:

<form action="/myformaction"> <label for="name">Your Name</label> <input type="text" name="name" placeholder="Your name here" required maxlength="100"> <label for="email">Your E-mail</label> <input type="email" name="email" placeholder="Your e-mail here" required></form>

Maior parte dos bots simples irá procurar padrões comuns de formulário, como nomes comuns de etiquetas, id’s de entrada, atributos comuns de entrada, campos obrigatórios, etc, e então o bot irá preenchê-los com informações falsas para tentar enviá-lo, e seus clientes, spams ou alguns códigos maliciosos. Os campos mais comuns para pesquisar são campos nomeados como “email, telefone, endereço”…

Então, vamos copiar isso e criar um simples honeypot alterando a nossa estrutura de formulários para:

<style> .ohnohoney{ opacity: 0; position: absolute; top: 0; left: 0; height: 0; width: 0; z-index: -1; }</style><form action="/myformaction"> <!-- Real fields --> <label for="nameaksljf">Your Name</label> <input type="text" name="nameksljf" placeholder="Your name here" required maxlength="100"> <label for="emaillkjkl">Your E-mail</label> <input type="text" name="emaillkjkl" placeholder="Your e-mail here" required> <!-- H o n e y p o t --> <label class="ohnohoney" for="name"></label> <input class="ohnohoney" autocomplete="off" type="text" name="name" placeholder="Your name here"> <label class="ohnohoney" for="email"></label> <input class="ohnohoney" autocomplete="off" type="email" name="email" placeholder="Your e-mail here"></form>

Vejamos as alterações:

Primeiro criamos uma classe para esconder coisas. A classe .ohnohoney. Importante para apontar algumas coisas agora:

  1. Não usar display:none, alguns bots não podem acessar campos com display none, outros simplesmente sabem que eles não devem preencher os campos display none. Não use “hidden” no nome da classe, alguns bots avançados podem reconhecê-lo.

  2. Então criamos os “campos reais”. Estes são os campos visíveis e os que devem ser relevantes para o seu backend em termos de dados. Estes campos devem ter as identificações alteradas para hashes. Normalmente eu uso o padrão “nameHASH” todos juntos. Não use “namehash” ou variações do mesmo, uma simples divisão exporia o nome real do campo. Agora, um bot não pode reconhecer o que são esses campos, eles apenas sabem que o formulário tem alguns campos que devem ser preenchidos, talvez seguindo o “tipo” como padrão.

  3. Ao criar os campos “h o n e y p o t” seremos capazes de identificar o Spammer. Importante para: Deixe a etiqueta vazia, use sua classe ‘ohnohoney’ para esconder todas essas entradas falsas. Torne o seu input falso o mais simples, genérico e atractivo possível. Use nomes simples e comuns como “e-mail, telefone, nome, etc”, desabilite o autocompletar (assim, o navegador não irá preenchê-lo), desabilite as regras, mas mantenha os tipos.

Agora temos 2 partes no nosso formulário: Campos reais com nossos inputs protegidos por hashes e nomes estranhos (você pode implementar o hash ou nomes estranhos como preferir). E o nosso honeypot (não escreva “honeypot”, prefira dividir as letras para evitar qualquer reconhecimento). Agora no seu backend:

  1. Verifica se algum dos campos “h o n e y p o t” veio preenchido. Se sim, parabéns, você prendeu um spam. A maioria deles irá preencher todos estes campos sem diferenciá-los. Portanto, tudo que você tem que fazer é verificar se algum dos seus campos “h o n e y p o t” veio preenchido, se sim, é um spam. Se preferir, você pode fazer essa verificação no cliente, no caso de um formulário ajax, isso evitará o uso de recursos do servidor para computar dados inúteis (mas mantenha a validação do backend de qualquer forma). Quando você pegar um spam, basta não enviar os dados e fazer o que quiser com ele. Se nomes como “email, telefone, etc” são importantes para o seu backend, basta transcrever os nomes usando arrays.

Aqui está um repo de arquivo único com uma implementação simples desta técnica:
https://github.com/felippe-regazio/php-honeypot-example

Remember: esta é apenas uma camada simples para prevenir ataques de uma forma simples, algumas tecnologias podem identificar até mesmo estes padrões, então use todas as armas que você puder contra ele. Mas eu acredito que este padrão simples pode evitar pelo menos 50% de spams na sua página web.