Combate A SPAM Em Formulários

É preocupante a avidez com que os spammers se dedicam em suas atividades criminosas. Os administradores de sites, principalmente os que aceitam comentários dos visitantes, precisam lidar constantemente com submissões de propagandas ao invés de comentários relacionados ao texto.

Um dos meus sites recebe diariamente mais de 50 spams através do formulário de contato. Enquanto outro chegou a receber 600 ‘comentários’ com links para sites de remédio. Isso de um dia para o outro.

Provavelmente você também tem histórias como estas para contar. E estando no mesmo barco, precisamos procurar formas de prevenção contra estas atividades.

Na blogosfera a taxa é de dois comentários válidos para oitenta spams. É um bombardeio covarde que quase não deixa espaços para ofensivas. Nos vemos obrigados a estar em uma eterna defensiva, pesquisando técnicas para criar barreiras de contenção.

Por isso, o Webmaster.pt vai apresentar uma série com três tutoriais abordando estratégias de prevenção contra spams.

Neste primeiro tutorial serão listados e exemplificados alguns métodos de controle contra spams.

No SPAM

Evitar Submissões Consecutivas

Os spammers são um bando de hienas insaciáveis. Para eles não basta adicionar um comentário-spam por texto, eles enviam dezenas, um depois do outro. Abordando o problema do ângulo das múltiplas submissões, podemos criar um código que verifica a última vez que o formulário foi enviado e só permite um novo envio após determinado tempo.



session_start();
if (isset($_POST['enviar'])) {
  $intervalo = 60;
  $agora = time();

  if (isset($_SESSION['ultimoEnvio']) and ($_SESSION['ultimoEnvio'] > ($agora - $intervalo))) {
    echo 'Espere alguns minutos até postar outro comentário';  
    exit;
  }
  $_SESSION['ultimoEnvio'] = $agora;
}

Vamos utilizar variável de sessão e por isso precisamos iniciar uma sessão com o session_start().

O código vai rodar quando o formulário for submetido. Na primeira variável é definido o tempo em segundos que dever haver entre uma submissão e outra. A função time() retorna o numero de segundos desde 01 de janeiro de 1970. Esse dado em si não importa. O fato dele mudar a cada segundo sim, pois desta forma temos um ponto de referência para fazer o cálculo. Podemos dizer que o time() informa o horário atual.

Vamos pular para o final do código onde é criada a variável de sessão ‘ultimoEnvio’. Ela recebe o número de segundos atual e é criada após um envio do formulário.

Voltando para o bloco condicional, ele primeiro verifica se a variável de seção foi iniciada. Pois se assim for, o formulário já foi enviado uma vez nesta sessão. Então continuamos a verificação. Se o valor da variável ‘ultimoEnvio’ for maior do que a subtração do ‘intervalo’ com o ‘agora’ significa que ainda não passou o tempo mínimo entre um envio e outro.

É mostrada uma mensagem e a execução é interrompida neste ponto com o exit().

Você pode incrementar o código adicionando verificação por ip também.

Dicionário De Termos

Se você resolver ler o conteúdo dos spams verá que não variam tanto assim. São remédios, vídeos e fotos de sexo, promessas de milhões na sua conta… Sendo que os temas não variam, as palavras utilizadas para descrevê-los seguem a mesma lógica. Sendo assim, você pode criar um pequeno dicionário com esses termos e fazer um comparativo deles com as mensagens dos comentários.

Dentre as diversas formas possíveis de realizar esta verificação, vejamos uma:



if (isset($_POST['enviar']))
{
  $suspeitas = array('palavras','suspeitas','de','spams');
  $mensagem = $_POST['msg'];
  $pecas = explode(' ',$mensagem);
  for ($i=0; $i<count($pecas); $i++)
  {
      $chave .= array_search($suspeitas[$i], $pecas);
  }
  if ($chave!='')
  {
    echo 'Spam';  
  }
}

A ação inicia quando o formulário é submetido. É criada uma array com as palavras mais comumente utilizadas para espalhar os spams e uma variável recebe o conteúdo da mensagem submetida. As palavras componentes da mensagem são divididas e armazenadas na variável ‘pecas’ que agora é uma array.

O bloco seguinte é que faz a verificação. O laço for será executado tantas vezes quanto o número de palavras componentes da mensagem. Utilizando a função array_search(), cada palavra suspeita é comparada com cada palavra existente na mensagem. Se elas forem iguais, a variável ‘chave’ recebe a posição que a palavra suspeita esta na array ‘pecas’.

Por fim é feito um bloco condicional para saber se a variável ‘chave’ contém algum valor. Se for o caso, ao menos uma palavra da mensagem é suspeita. Neste ponto você pode simplesmente cortar a palavra da mensagem ou bloquear completamente o envio.

Um ponto importante sobre a verificação é que o array_search é sensível à caixa. Então, se houver uma busca pela palavra ‘spam’, a palavra ‘Spam’ escapa dessa verificação. Para funcionar bem é preciso conferir por todas as variantes da palavra. Um trabalho um tanto dispendioso.

Esse método tem a vantagem de barrar tanto programas spammers quanto spammers de carne e osso, pois verifica o conteúdo da mensagem. E isso é bastante eficaz porque desfigura a mensagem original e torna inútil para o atacante continuar com as postagens.

Ocultando Campo Do Formulário

Grande parte dos programas disseminadores de spams funciona da seguinte maneira: acessa o site, cataloga os campos requeridos no formulário e o endereço de submissão desse formulário. Com isso ele inicia os trabalhos inserindo valores diferentes nos campos e enviando.

Uma forma de lidar com este problema foi sugerida por Jared Smith. Consiste em adicionar um campo oculto no formulário, obviamente não visível para o visitante, mas percebido pelos spambots. Estes entendem que é um campo requerido e preenchem. Então você verifica, se este campo recebeu um valor, é praticamente certo que foi um programa que enviou os dados.

Nâo permitir que links sejam adicionados às mensagens é outra medida importante. Manter o atributo rel dos links com o valor “nofollow” evita que outros sites ganhem page rank. O que torna inútil tentar adicionar conteúdo na sua página para melhorar a posição nos sites de busca.

Conclusão

Prevenção é sempre bom. Utilizar diversos métodos de combate combinados melhoram as chances de sucesso. Vimos que trabalho exige, mas nem é tão complicado assim adicionar esta camada de proteção aos seus formulários.

Como assim? Chegou ao fim da conclusão do artigo e nem falou sobre CAPTCHA, as estrelas no combate aos spams?!

Fique tranquilo. O próximo tutorial desta série será totalmente dedicado a estas imagens tortas que tornam menos fácil vida dos spammers.

Be Sociable, Share!

1 Comentários

  1. Eu tive uma pequena chatice com spam via formulários.

    Como os nomes dos campos do formulário estão em PT o bot utiliza muito; "Unknown" – como deve procurar a variável "name" e encontra a variável "nome" ou "morada", fica confuso e para reforçar utilizo a tal dica do campo oculto.

    O número de spam que recebo é zero.

Participa! Comenta...