Como vetar / deletar automaticamente spam no wordpress

Não, eu não estou falando de mandar para a caixa de spam. Isso o Akismet já faz muito bem. O que eu vou explicar aqui bloqueia o comentário no momento em que está sendo postado, antes mesmo de passar pelo Akismet.

Nos últimos meses tenho sido bombardeado por milhares de comentários de spam mensais que provavelmente vem do mesmo spammer, divulgando uma dúzia de sites de mala direta (que hoje é sinônimo de spam). Vejam neste blog um exemplo de como esse spammer se comporta. A página recebeu 65 comentários e todos seguem o mesmo padrão.

A predominância desse spammer é tão grande que eu acabo de apagar cerca de 1600 spams, filtrando pelos nomes desses sites, e só restaram uns dez que nada tinham a ver com eles. Ou seja: se eu conseguisse barrar a postagem da propaganda dessa dúzia de sites, minha caixa de spam estaria sempre razoavelmente limpa.

Eu fiz uma pesquisa semanas atrás e não consegui achar nenhum plugin que fizesse isso. Todos os plugins que encontrei limitam-se a jogar mensagens para a caixa de spam. E isso o akismet já faz. Mas com milhares de mensagens que são indubitavelmente spam na caixa, você fica praticamente impossibilitado de detectar as mensagens que cairam lá acidentalmente.

Hoje, depois de ficar de saco cheio por ter que filtrar e apagar essas mensagens de novo, quando “não custaria nada” ao wordpress checar uma lista de doze palavras, fiz uma nova busca e encontrei a solução.

Não é tão simples quanto instalar um plugin, mas também não é nada difícil. Aqui está o código adaptado para as minhas necessidades:


//Acrescente isso no final de functions.php (é um arquivo do tema, não do wordpress)
//pode ser imediatamente antes da linha final com um "?>".
function in_comment_post_like($string, $array) {
foreach($array as $ref) { if(strstr($string, $ref)) { return true; } }
return false;
}
function drop_bad_comments() {
if (!empty($_POST['comment'])) {
$post_comment_content = $_POST['comment'];
$lower_case_comment = strtolower($_POST['comment']);

// Lista de palavras banidas.
// Comentários com essas palavras serão automaticamente deletados
// e quem postou, se não for um bot, verá um alerta.
$bad_comment_content = array(
'viagra',
'hydrocodone',
'xanax',
'tramadol',
'lorazepam',
'adderall',
'dexadrine',
'no prescription',
'oxycontin',
'without a prescription',
'sex pics',
'family incest',
'online casinos',
'online dating',
'cialis',
'ecadastro.com.br',
'seomaster.com',
'divulgaemail.com',
'listadeemails.com',
'casaemail.com.br',
'acertemail.com',
'maladiretasegmentada.com.br',
'busquemail.com.br',
'boliche.com.br',
'kitsucesso.com',
'emailsvip.com.br',
'kitdeemail.com',
'amoxicillin'
);

if (in_comment_post_like($lower_case_comment, $bad_comment_content)) {
wp_die( __('Seu comentário contém palavras ou expressões banidas.') );
}
}
}
add_action('init', 'drop_bad_comments');

O que achei especialmente interessante é que se um humano colocar uma dessas palavras em um comentário legítimo (“viagra” é um exemplo), seu comentário não vai se perder no vazio, porque o script vai responder com “Seu comentário contém palavras ou expressões banidas.”, bastando então clicar no botão Voltar do browser para poder editar o comentário. O script nem tenta dizer o que o gatilhou, entretanto.

Pode testar à vontade. Tente postar um comentário com uma dessas palavras e veja o que acontece.

Nesta outra página você encontrará uma versão mais elaborada, que faz um log no servidor de cada tentativa, com texto, IP, etc.

OBS.: Faça um backup de functions.php antes de fazer qualquer mudança. Uma simples vírgula que você esqueça de colocar pode fazer você perder o acesso ao blog. Aconteceu comigo e fui obrigado a transferir um backup que eu tinha do arquivo por FTP, porque o editor do wordpress não funcionava mais.

Edit: é claro que eu poderia usar um captcha, mas isso acaba enchendo o saco dos leitores legítimos.

12 comentários
  • Luciano - 464 Comentários

    Legal o script, vou testar e se tiver alguma mod interessante eu publico também ok?
     
    Quanto ao captcha, eu tenho uma péssima noticia. Apesar de eu usar o reCatpcha no meu blog, ainda assim passam algumas mensagens de spam.
     
    Logo concluo que: A) os spammers acharam um jeito de burlar o reCaptcha. B) Existe algum furo no wordpress C) já existe algum robot com um bom OCR que acerta alguns captchas.
     
    Um detalhe interessante, nos últimos 4 meses, a taxa de spam aumentou assustadoramente no meu blog.

  • Jefferson - 6.465 Comentários

    Acabo de encontrar um problema no script. A presença da palavra “cialis” veta comentários com a palavra “especialista”. Recomendo a remoção dessa palavra da lista ou a troca por algo menos genérico como “buy cialis”.

    Acho que o script precisa de uma versão mais específica, que não crie esse tipo de problema.

  • Luciano - 464 Comentários

    Pode ser feita uma gambiarra temporária… acrescente um espaço antes da palavra, ‘ cialis’, assim pelo menos não pega especialista, e a bendita palavra pelo menos na maioria das vezes ela sempre virá precedida de outra, e o espaço vai encaixar.
     
    Mas eu vou dar uma olhada se dá pra modificar esse script pra pegar as palavras exatas, talvez precise usar RegEx pra isso.

  • […] Jefferson fez este post com um script (que ele encontrou) que ajuda a matar uma boa parte do SPAM no […]

  • Luciano - 464 Comentários

    Jefferson, consertei o script para não confundir “especialista” com “cialis”.
     
    Veja aqui como ficou: http://www.crashcomputer.caetano.eng.br/?p=3914
     
    :-P

  • Jefferson - 6.465 Comentários

    Encontrei outro problema com o script. Se você usa Firefox, tem a oportunidade de clicar no botão Voltar para editar o que você escreveu, mas no IE o conteúdo do form é perdido. Um usuário legítimo pode ficar muito frustrado ao ver que tudo que ele escreveu se perdeu por causa de uma palavra.

    Talvez seja bom fazer o script exibir todo o texto do comentário abaixo do aviso de que houve uma palavra banida. Vou experimentar com isso.

    Eu sei que o IE é um lixo mas até mesmo quem o despreza como eu às vezes se vê usando-o por diversas razões. Não dá para ignorar sua onipresença.

  • Luciano - 464 Comentários

    Eu normalmente daria uma banana pra quem usa a m$3d@ do IE. Mas… como foi você que pediu, modifiquei o script pra cuspir o comentário junto com a mensagem de alerta.
     
    Porem, eu acho que os usuários legítimos não verão esta tela não… afinal a lista de palavras proibidas não faz parte do vocabulário dos que comentam por aqui e nem lá no meu, né? :-P

    • Jefferson - 6.465 Comentários

      Pois aconteceu comigo no seu blog. No comentário onde escrevi “c1alis” ou “c.ialis”, eu havia escrito também a palavra sem obfuscar. Se não estivesse usando o Firefox teria perdido todo o comentário, que era grandinho.

      E eu pretendo aumentar a lista com expressões como “online shop” e “porn video” que eventualmente podem ser usadas por leitores legítimos do meu blog. São casos raros, mas não são impossíveis.

  • […] one came from the excellent Jefferson Ryan: Como vetar / deletar automaticamente spam no wordpress (in […]

  • Luciano - 464 Comentários

    Bom… eu encontrei um jeito simples e fácil de inserir um campo no form de comentários, que DEVE ser deixado em branco para comentar, se preencher, recusa comentário com a mesma atitude que uma palavra proibida.
     
    O bom disso é que inseri essa função no script de palavras proibidas, de forma que basta inserir um campo novo no formulário.
     
    No meu caso, eu coloquei um campo visível (sem o atributo hidden), com largura de um caractere, mas sem limite de caracteres para o preenchimento.
     
    Agora vem uma questão que gostaria de discutir com você e outras pessoas, como deixar esse campo no form. Pensei em dois jeitos:
     
    1) formatar o campo com  CSS para que ele fique da mesma cor de fundo da página de comentários, dessa forma ele fica “invisível” a humanos, mas não a robôs.
     
    2) deixar o campo visível, com a mesma formatação dos demais, e colocar um label algo como: Se você não é um robô, não preencha este campo.
     
    Em ambos os casos, colocar também um tabindex maior do que o ultimo elemento do form de comentário, no caso o botão “postar comentário”. Assim mesmo que um humano use TAB para avançar os campos, ele não vai cair nesse campo, a menos que dê um TAB a mais do que o necessário para chegar ao botão.
     
    Qual será a melhor forma na sua opinião? No meu blog, provisóriamente, deixei o campo com uma borda cinza, para quem quiser testar comentar preenchendo o campo que não deve ser preenchido. :-P

  • Jefferson - 6.465 Comentários

    O problema com a palavra “especialista” é chamado de Scunthorpe Problem.

Deixe um comentário para Luciano Cancelar resposta

Você pode usar estas tags HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  

  

  

:) :( ;) O_o B) :lol: :huh: :S :D :-P 8-O :yahoo: :rtfm: :dashhead1: :clapping: more »