Acabando com SPAM nos seus formulários

Independente da linguagem de backend que você utiliza, SPAMs são sempre um problema. É você colocar um formulário no seu site, e começar a receber milhões de e-mails de robôs. Tem solução pra isso? Sim! E não é captcha!

Quer saber o que é? Vem que eu te mostro :D

Essa é uma dica rápida, mas que pode acabar com a dor de cabeça de muita gente.

Quando você tem esse tipo de problema, a primeira coisa que vêm à cabeça é: Vou colocar um captcha!

Aí você percebe que os e-mails recebidos começam a diminuir, só que a balança pende para o lado errado: humanos deixam de enviar mensagens, pois não conseguem ler um captcha direito. Já robôs conseguem descobrir praticamente 100% dos captchas atuais, e enviam mensagens com links, propagandas, etc., loucamente!

Aí você pensa: Vou colocar então um campo para o usuário efetuar uma ação simples: uma soma, por exemplo. Você coloca dois números aleatórios e manda a pessoa colocar o resultado em um input. Já melhorou um pouco a usabilidade, mas se você parar pra pensar, o usuário nada tem a ver com os SPAMs que você recebe.

Porque dificultar para o usuário enviar uma mensagem, sendo que os robôs vão continuar enviando SPAMs?

Quando estamos programando, em alguns momentos precisamos pensar “ao contrário”, ou fora da caixa. Imagine esse exemplo (em JS):

1
2
3
4
5
6
7
8
9
10
11
12
function getUserDataById( id ) {
if( id ) {
return {
name: getUserName(),
address: getUserAddress(),
accountInfo: getUserAccountInfo()
};
}
else {
return false;
}
}

Se nós pensássemos “de forma invertida”, poderíamos tirar toda a nossa lógica de dentro do if:

1
2
3
4
5
6
7
8
9
10
11
function getUserDataById( id ) {
var userdata = {};
if( !id )
return false;

return {
name: getUserName(),
address: getUserAddress(),
accountInfo: getUserAccountInfo()
};
}

Ao invés de verificar se o id existe para pegar todos os dados, e se não existir, retornar false, fazemos o contrário: se o id não existir, retorna false de uma vez. O resto só vai acontecer se o id existir!

Para formulários, podemos pensar da mesma forma! Se você perceber, os robôs preenchem todos os campos do seu formulário. Então o que você pode fazer é o seguinte: crie um campo input, e esconda-o com CSS. O seu usuário não verá esse campo, logo, ele não será preenchido. Já um robô, que vai consultar seu HTML, vai ver o campo, e vai preenchê-lo! Então você só precisa validar no backend: se o campo foi preenchido, você não faz nada. Caso contrário, você envia o e-mail :D

É importante deixar nesse campo um placeholder, avisando ao usuário que ele não deve preencher o campo, caso ele desabilite o CSS por qualquer motivo, e o seu campo fique visível.

Tive problemas com vários formulários em sites e, após fazer isso, o problema foi resolvido em 100% dos casos!

Mas eu não descobri isso sozinho. Eu peguei a ideia de um formulário do Mailchimp, que faz exatamente isso!

Grande sacada, não?

O que achou da dica? Já conhecia? Tem uma técnica melhor? Compartilhe conosco! :D

Sobre o #1postperday: https://blog.da2k.com.br/2014/12/31/um-post-por-dia/

Tem alguma sugestão para os próximos posts do #1postperday? Deixe ela aqui: https://github.com/fdaciuk/fdaciuk.github.io/issues/1