DevWebPHP
Image
13/09/2019

Como se proteger contra bot de spam

# Como criar uma armadilha simples para proteger seus formulários contra bot de spam

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

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

<form id="id-formulario" action="/acao-formulario">
    <label for="nome">Seu nome</label>
    <input type="text" id="nome" name="nome" placeholder="Seu nome" required maxlength="100">
    <label for="email">Seu melhor e-mail</label>
    <input type="email" id="email" name="email" placeholder="Seu melhor e-mail" required>
</form>
1
2
3
4
5
6

A maioria dos bots simples pesquisará padrões comuns, como nomes comuns de nas label, IDs de input, atributos comuns de input, campos obrigatórios, etc., e o bot irá preenchê-los com informações falsas para tentar enviar você e seus clientes, spams ou alguns códigos maliciosos. Os campos mais comuns a serem pesquisados ​​são campos nomeados como “email, telefone, endereço” …

Então, vamos nos enganar e criar uma armadilha simples alterando nossa estrutura de formulário para:

<style>
    .cilada{
        opacity: 0;
        position: absolute;
        top: 0;
        left: 0;
        height: 0;
        width: 0;
        z-index: -1;
    }
</style>

<form id="id-formulario" action="/acao-formulario">
    <!-- Campos reais -->
    <label for="nomel34k5jh">Seu nome</label>
    <input type="text" id="nomel34k5jh" name="nomel34k5jh" placeholder="Seu nome" required maxlength="100">
    <label for="email23jl4">Seu melhor e-mail</label>
    <input type="email" id="email23jl4" name="email23jl4" placeholder="Seu melhor e-mail" required>
    <!-- Cilada -->
    <label class="cilada" for="name"></label>
    <input class="cilada" autocomplete="off" type="text" id="name" name="name" placeholder="Your name here">
    <label class="cilada" for="email"></label>
    <input class="cilada" autocomplete="off" type="email" id="email" name="email" placeholder="Your e-mail here">
</form>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Vamos ver as alterações:

Primeiro, criamos uma classe para ocultar as coisas. A classe .cilada. Importante apontar algumas coisas agora:

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

Do que criamos os “campos reais”. Esses são os campos visíveis e os que devem ser relevantes para o seu back-end em termos de dados. Esses campos devem ter os id alterados para hashes. Geralmente eu uso o padrão “nameHASH” todos juntos. Não use “nome-hash” ou variações disso, um simples split exporia o nome do campo real. Agora, um bot não pode reconhecer quais são esses campos, eles apenas sabem que o formulário possui alguns campos que devem ser preenchidos, talvez seguindo o type como padrão.

Criando os campos “cilada”, poderemos identificar o Spammer. Importante: deixe a label vazia, use sua classe .cilada para ocultar todas os input falsos. Transforme seu input falso da forma mais simples, genérica e atraente possível. Use nomes simples e comuns como “email, telefone, nome etc.”, desative o autocomplete (para que o navegador não o preencha), desative as regras, mas mantenha os tipos.

Agora, temos duas partes em nosso formulário: campos reais com nossas entradas protegidas por hashes e nomes estranhos (você pode implementar o hash ou nomes estranhos conforme preferir). Agora no seu back-end:

Verifique se algum dos campos “cilada” foi preenchido. Se sim, parabéns, você interceptou um bot de spam! A maioria deles preencherá todos esses campos sem diferenciá-los. Portanto, tudo o que você precisa fazer é verificar se algum dos campos “cilada” foi 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 calcular dados não úteis (mas mantenha a validação de back-end de qualquer maneira). Quando você pega um spam, simplesmente não envie os dados e faça o que quiser com eles. Se nomes como “email, telefone etc.” forem importantes para o seu back-end, apenas transcreva os nomes usando matrizes.

Lembre-se: esta é apenas uma camada simples para impedir ataques de uma maneira simples; algumas tecnologias podem identificar até esses padrões; portanto, use todas as armas que puder contra ele. Mas acredito que esse padrão simples possa evitar pelo menos 50% dos spams na sua página da web.

Artigo original: https://dev.to/felipperegazio/how-to-create-a-simple-honeypot-to-protect-your-web-forms-from-spammers–25n8

Copyright © DevWebPHP 2020