Como evitar que robôs preencham automaticamente um formulário?

105

Estou tentando criar um mecanismo de anti-spam bom o suficiente para evitar entradas geradas automaticamente. Eu li que técnicas como captcha, 1 + 1 =? as coisas funcionam bem, mas também apresentam uma etapa extra que impede o uso rápido e gratuito do aplicativo (não estou procurando nada assim, por favor).

Tentei definir alguns campos ocultos em todos os meus formulários, com display: none; No entanto, tenho certeza de que um script pode ser configurado para rastrear o ID do campo do formulário e simplesmente não preenchê-lo.

Você implementa / conhece um bom método anti-robôs de preenchimento automático de formulários? Existe algo que pode ser feito perfeitamente com o processamento do lado do servidor HTML E / OU e ser (quase) à prova de balas? (sem JS, pois pode-se simplesmente desativá-lo).

Estou tentando não depender de sessões para isso (ou seja, contando quantas vezes um botão é clicado para evitar sobrecargas).

Garota
fonte
5
Obrigado por não querer soluções de captcha! IMO, spam de formulários é um problema para os proprietários de sites e evitá-lo não é um fardo que o usuário deva suportar. Existem muitas maneiras alternativas de abordar o spam no final do site, conforme evidenciado pelas respostas aqui. Métodos que requerem interação do usuário só devem ser usados ​​por preguiçosos ou novatos.
Mike

Respostas:

73

Uma maneira fácil de implementar, mas não infalível (especialmente em ataques "específicos") de solucionar o anti-spam é rastrear o tempo entre o envio do formulário e o carregamento da página.

Os bots solicitam uma página, analisam a página e enviam o formulário. Isso é rápido.

Os humanos digitam um URL, carregam a página, esperam até que a página seja totalmente carregada, rola para baixo, lêem o conteúdo, decidem se comentam / preenchem o formulário, requerem tempo para preencher o formulário e enviam.

A diferença de tempo pode ser sutil; e como controlar esse tempo sem cookies requer alguma forma de banco de dados do lado do servidor. Isso pode ser um impacto no desempenho.
Além disso, você precisa ajustar o tempo limite.

Pindatjuh
fonte
9
Cuidado se você deseja permitir que os usuários finais usem preenchimentos automáticos de formulários, como addons.mozilla.org/en-US/firefox/addon/1882, que podem permitir um envio muito rápido. Assim como captcha qualquer coisa que chateie o usuário final geralmente não é bom, e principalmente quando evita que uma pessoa furada vá (muito) rápido.
floco de neve
1
Bom ponto, mas tudo depende do contexto. Se o formulário for um formulário de login, concordo totalmente com você. Mas por que desabilitar o login de bots? Se o contexto for uma caixa de comentário, como esta no StackOverflow, eu tenho certeza: se você usar o preenchimento automático em uma caixa de comentário, você é um spammer. Observe que se você usar o preenchimento automático para assinaturas, ainda precisará de tempo para realmente digitar o conteúdo.
Pindatjuh
5
Observe que o SO faz algo assim. Edite um comentário rapidamente ou muitas vezes seguidas e você verá a mensagem "Você é humano?" página.
Jakob Borg
2
Os hackers nem sempre solicitam o formulário. Às vezes, um URL cuidadosamente elaborado (usando GET ou POST) será suficiente para postar o formulário várias vezes com pouco esforço.
crafter
1
Implemente isso com captcha. Se o formulário foi enviado muito rápido, apresente um captcha para permitir a passagem de usuários genuínos.
Yashovardhan99
75

Na verdade, acho que um campo de Honey Pot simples funciona bem. A maioria dos bots preenche todos os campos do formulário que veem, na esperança de contornar os validadores de campo obrigatórios.

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

Se você criar uma caixa de texto, ocultá-la em javascript e verificar se o valor está em branco no servidor, isso elimina 99% dos robôs que estão por aí e não causa nenhuma frustração em 99% dos seus usuários . Os 1% restantes que têm o javascript desabilitado ainda verão a caixa de texto, mas você pode adicionar uma mensagem como "Deixe este campo em branco" para esses casos (se você se importar com eles).

(Além disso, observando que se você fizer style = "display: none" no campo, será muito fácil para um robô apenas ver isso e descartar o campo, por isso prefiro a abordagem javascript).

Ben Scheirman
fonte
1
Você acha que os bots realmente passam pelo arquivo css e descobrem que ele é exibido: nenhum; ? Eu realmente prefiro não usar uma solução baseada em JS, já que pode ser facilmente desativada.
Gal
1
Parece ser uma solução antiga para webmasters, incluindo toneladas de palavras-chave não pertinentes a fim de impulsionar seu webranking. Acho que os bots do rastreador de pesquisa, como os do Google, podem descobrir que é display: none. Por que outros bots não seriam capazes de fazer isso?
floco de neve de
2
Usei essa técnica agora em dois sites que estavam ficando malucos e as inscrições de bot agora são zero 0 em ambos. Não vai ajudar contra ataques direcionados, mas a maioria está apenas procurando exploits ou spamming de qualquer maneira.
nirvdrum
25
Um pequeno ponto aqui: para contornar o problema de JS, apenas use CSS para posicionar sua entrada do honeypot acima do topo da página - desta forma, não haverá problema em desabilitar o js e, para contornar isso, o bot terá que ser capaz de analisar o CSS posicionamento absoluto e tomar uma decisão de bom senso se é um honeypot ou não. um pouco mais à prova de balas desta forma :)
totallyNotLizards
3
@ alexy13 sim, é mais simples, mas conforme observado na resposta, também é muito mais fácil para um bot descobrir o que você está tentando fazer, apenas teste uma propriedade CSS. Se, no entanto, você usar a estratégia de posicionamento absoluto, o bot tem que analisar todas as suas regras de posicionamento e as regras da maioria dos pais do elemento para poder descobrir se a entrada seria visível ou não, e então descobrir se ou não agir com base nessa informação - o que é mais problemático do que vale para a maioria (senão todos) dos bots.
totalmenteNotLizards
22

E se - o Bot não encontrar nenhum form?

3 exemplos:

  1. Insira seu formulário usando AJAX
  • Se você concorda com usuários que têm JS desativado e não conseguem ver / enviar um formulário, você pode notificá-los e fazer com que eles habilitem o Javascript primeiro usando uma instrução noscript:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • Crie um form.htmle coloque seu formdentro de um <div id="formContainer">elemento.

  • Dentro da página onde você precisa chamar esse formulário, use um empty <div id="dynamicForm"></div>e este jQuery:$("#dynamicForm").load("form.html #formContainer");

  1. Construa seu formulário inteiramente usando JS

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

  1. Entrada de isca de bot
  • Bots gostam ( realmente gostam) de elementos de entrada picantes , como:
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`[email protected]`
  • Depois de usar o HTML acima, você também pode usar CSS para não exibir a entrada:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • Agora que sua entrada não está visível para o usuário, espere no PHP que $_POST["email"] esteja vazio (sem nenhum valor)! Caso contrário, não envie o formulário.
  • Finalmente, tudo que você precisa fazer é criar uma outra entrada como <input name="sender" type="text" placeholder="Your email"> depois (!) O "bot-isca" de entrada para o real endereço do utilizador-mail.

Agradecimentos:

Developer.Mozilla - Desativando o preenchimento automático do formulário
StackOverflow - Ignorar Tabindex

Roko C. Buljan
fonte
7
O navegador de um usuário legítimo poderia potencialmente ver o campo de entrada da isca como um campo de e-mail e preenchê-lo automaticamente quando o usuário optar por preencher automaticamente o restante do formulário? O usuário não veria que um campo distante da tela foi preenchido e eles ainda pareceriam um bot.
wilbbe01
Eu suspeito autocomplete=nopeque o padrão seria on;-) MDN: input # attr-autocomplete
lidar com
@handle não importa, é uma entrada de isca de bot. Você pode escrever autocomplete="oh sunny day"para esse assunto.
Roko C. Buljan
19

O que fiz foi usar um campo oculto e colocar o timestamp nele e então compará-lo com o timestamp no servidor usando PHP.

Se fosse mais rápido do que 15 segundos (depende de quão grande ou pequeno são seus formulários) isso era um bot.

Espero que esta ajuda

adnhack
fonte
1
Boa ideia, no entanto, eu definiria o limite para cerca de 3 a 5 segundos para permitir usuários rápidos / avançados. Eu uso essa mesma abordagem, e definir um limite em meus formulários para 3 segundos filtrou 99% dos bots.
Kayla
@adnhack Você quer dizer algo como: 1) no carregamento da página com php, obtenha o horário do servidor e crie a sessão. 2) o usuário ou bot preenche o formulário, clica em Enviar e $.postenvia tudo para o arquivo php externo. 3) em php externo obter novamente o tempo do servidor e comparar com o tempo da sessão?
Andris de
16

Uma forma muito eficaz de eliminar virtualmente o spam é ter um campo de texto que contenha um texto como "Remova este texto para enviar o formulário!" e esse texto deve ser removido para enviar o formulário.

Após a validação do formulário, se o campo de texto contiver o texto original, ou qualquer texto aleatório para esse assunto, não envie o formulário. Os bots podem ler os nomes dos formulários e preencher automaticamente os campos Nome e Email, mas não sabem se precisam realmente remover o texto de um determinado campo para enviar.

Implementei esse método em nosso site corporativo e eliminou totalmente o spam que recebíamos diariamente. Realmente funciona!

HawleyTronics
fonte
Interessante, você sabe se é mais eficaz do que as outras respostas ... uma caixa de texto oculta ou controlar o tempo que leva para preencher o formulário?
Austin Henley
4
Isso também pegaria aqueles usuários que não podem seguir as instruções, o que pode não ser desejado.
wilbbe01
Eu gosto disso! Até que o bot comece a tentar diferentes combinações de campos em branco e preenchidos ... a melhor maneira de testar é implementar isso e fazer a varredura com um destes: sectoolmarket.com/…
nmit026
Eficaz na medida em que a pessoa que gerencia o bot não descubra e ajuste o código.
Talha Awan
11

Que tal criar uma caixa de entrada de campo de texto da mesma cor do fundo que deve permanecer em branco. Isso contornará o problema de uma exibição de leitura de bot: nenhum

Steve
fonte
2
Adicione isso como um comentário, por favor, quando você tiver mais reputação em vez de uma resposta;)
Rob
3
Isso apresenta problemas de acessibilidade. O índice honeypot não ficará oculto para usuários com leitores de tela.
Otterfan
5
Sou um usuário cego e encontrei um campo de formulário como este uma vez, e o rótulo acima dizia: "Se você pode ver isto, deixe em branco." IMO muito eficaz.
Parham Doustdar
8

http://recaptcha.net/

reCAPTCHA é um serviço antibot gratuito que ajuda a digitalizar livros

Foi adquirido pelo Google (em 2009):

Veja também

Anantha Kumaran
fonte
5
Como usuário, acho que o recaptcha é difícil de descobrir muitas vezes. Algumas das palavras são tão difíceis de ler, que você acaba tendo que tentar 3 ou 4 vezes. Embora isso definitivamente ajude com o problema dos robôs.
Brian,
Encontrei-me nesta página porque CAPTCHA / reCAPTCHA não para atualmente o envio de formulário de bot. Isso aconteceu 5 anos depois e é uma técnica nova do que quando essa resposta foi dada
JohnnyFaldo
Estou surpreso por essa resposta não ter mais votos positivos. quer o usuário goste ou não, essa é uma ótima solução. Principalmente se for usado apenas para o formulário de inscrição.
towi_parallelism
Hoje em dia o recaptcha começa como uma simples caixa de seleção, talvez não seja tão doloroso quanto costumava ser? ...
rogerdpack de
6

Muitos desses spam-bots são apenas scripts do lado do servidor que vagam pela web. Você pode combater muitos deles usando algum javascript para manipular a solicitação do formulário antes de ser enviada (ou seja, definindo um campo adicional com base em alguma variável do cliente). Esta não é uma solução completa e pode levar a muitos problemas (por exemplo, usuários sem javascript, em dispositivos móveis, etc), mas pode fazer parte do seu plano de ataque.

Aqui está um exemplo trivial ...

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

Em algum lugar do seu script php ...

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

Além disso, os captchas são ótimos e realmente a melhor defesa contra spam.

John Himmelman
fonte
Obrigado, embora o javascript possa ser facilmente desativado em qualquer navegador, aniquilando assim o meu "mecanismo anti-spam", então estou procurando algo mais global.
Gal
Posso estar errado, mas isso não diria a todos os usuários com deficiência de JS 'você é um cliente ruim, vá embora, por favor'?
Gal
Gal, é um exemplo trivial , meramente demonstrando como validar em relação a uma solicitação var definida por js do lado do cliente.
John Himmelman
@John Himmelman Captchas são solucionáveis ​​e não necessariamente a melhor defesa contra spam. Existem serviços pagos, como o anti-captcha.com, que resolvem captchas de formulários por uma taxa baixa.
O problema com essa abordagem é que tenho visto muitos bots usando o PhantomJS. Isso permitiria que eles passassem.
Parham Doustdar
4

Estou surpreso que ninguém tenha mencionado esse método ainda:

  • Em sua página, inclua uma pequena imagem oculta.
  • Coloque um biscoito ao servir esta imagem.
  • Ao processar o envio do formulário, verifique o cookie.


Prós:

  • conveniente para usuário e desenvolvedor
  • parece ser confiável
  • sem JavaScript

Contras:

  • adiciona um pedido HTTP
  • requer que os cookies sejam habilitados no cliente


Por exemplo, este método é usado pelo plugin do WordPress Cookies para comentários .

Gras Double
fonte
Os bots que usam coisas como o PhantomJS não contornariam isso facilmente?
Parham Doustdar
1
Como é um mecanismo de navegador completo, que carrega recursos e tal, sim, isso deve ser possível. Ainda assim, não tenho certeza se ele é frequentemente usado para um bot de spam, pois é provavelmente muito mais lento do que os scripts cURL.
Gras Double
algum motivo seria melhor do que um token CSRF?
xenoterracide de
1
um token CSRF não irá parar um bot. Primeira solicitação, OBTENHA o formulário, que inclui o token. 2ª solicitação, POSTAR o formulário, incluindo o token.
Gras Double
4

Com o surgimento de navegadores sem cabeça (como phantomjs) que podem emular qualquer coisa, você não pode supor que:

  • bots de spam não usam javascript,
  • você pode rastrear eventos de mouse para detectar bot,
  • eles não verão que um campo está visualmente oculto,
  • eles não vão esperar um determinado tempo antes de enviar.

Se isso costumava ser verdade, não é mais verdade.

Se você não quiser uma solução amigável, basta fornecer um lindo botão de envio "Eu sou um spammer" :

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

Claro que você pode brincar com dois input[type=image]botões de imagem , mudando a ordem após cada carregamento, as alternativas de texto, o conteúdo das imagens (e seu tamanho) ou o namedos botões; o que exigirá algum trabalho no servidor.

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

Por motivos de acessibilidade, você deve colocar uma alternativa textual correta, mas acho que uma frase longa é melhor para usuários de leitores de tela do que ser considerada um bot.

Observação adicional: esses exemplos ilustram que entender inglês (ou qualquer idioma) e ter que fazer uma escolha simples é mais difícil para um spambot do que esperar 10 segundos, manusear CSS ou javascript, saber que um campo está oculto, emular o movimento do mouse ou emulando a digitação do teclado, ...

Adão
fonte
Parece-me que o próprio fato de você ter de colocar o texto alternativo significa que sua solução de duas imagens é tão suscetível ao script quanto as outras alternativas. E para o botão "Não sou um spammer": isso também não pode ter script?
Hawkeye
@Hawkeye Minha resposta foi que um navegador sem cabeça pode emular qualquer coisa : javascript, atrasos, movimento do mouse, campos ocultos, ... O termo "bonito" antes dos meus exemplos era meio "sarcástico". Mas esses exemplos ilustram que entender inglês e ter que fazer uma escolha simples é mais difícil para um spambot do que: esperar 10 segundos, manusear CSS ou javascript, saber que um campo está oculto, emular o movimento do mouse ou emular a digitação do teclado, ...
Adam
Eu vejo seu ponto agora. Talvez adicione a última declaração "Mas esses exemplos ilustram ..." etc. à sua resposta. Porque isso me ajudou a entender o que você quer dizer. A princípio parecia um argumento contraditório de que "não podemos presumir que os bots não podem ...", mas depois liste coisas que ainda não podemos presumir que os bots não possam fazer. Mas o ponto crucial do seu ponto é que o seu exemplo (ter que escolher qual botão enviar) é mais difícil - o que (agora que eu entendo) é uma resposta brilhante. +1
Hawkeye
3

Uma maneira muito simples é fornecer alguns campos como <textarea style="display:none;" name="input"></textarea>e descartar todas as respostas que tenham isso preenchido.

Outra abordagem é gerar todo o formulário (ou apenas os nomes dos campos) usando Javascript; poucos bots podem executá-lo.

De qualquer forma, você não fará muito contra "bots" vivos de Taiwan ou da Índia, que recebem US $ 0,03 por um link postado e ganham a vida assim.

SF.
fonte
2
Sei que essa resposta tem quase 7 anos, mas acho que vale a pena comentar. Muitos bots podem ser programados para ignorar campos com um estilo = "display: none" para evitar este tipo de proteção.
Kenny Johnson
Existem dezenas de métodos de obscurecimento de entradas, usando Javascript, exibindo elementos fictícios em cima deles, movendo-os para fora da área visível, estilizando-os para se misturar com o plano de fundo ou decorações de layout perfeitamente etc. de hash => original na sessão do lado do servidor) ajudará contra o uso de nomes como dicas e mapeamento manual de quais entradas são válidas. Independentemente disso, não há defesa contra spam manual.
SF.
2

Tenho uma abordagem simples para impedir spammers que é 100% eficaz, pelo menos em minha experiência, e evita o uso de reCAPTCHA e abordagens semelhantes. Passei de quase 100 spams por dia em um dos formulários html de um dos meus sites para zero nos últimos 5 anos depois de implementar essa abordagem.

Ele funciona aproveitando as vantagens dos recursos ALIAS de e-mail da maioria dos scripts de gerenciamento de formulários html (eu uso FormMail.pl), junto com um "código" de envio gráfico, que é facilmente criado no mais simples dos programas gráficos. Um desses gráficos inclui o código M19P17nH e o prompt "Digite o código à esquerda".

Este exemplo específico usa uma sequência aleatória de letras e números, mas eu tendo a usar versões não inglesas de palavras familiares aos meus visitantes (por exemplo, "pnofrtay"). Observe que o prompt para o campo do formulário é incorporado ao gráfico, em vez de aparecer no formulário. Assim, para um robô, esse campo de forma não apresenta nenhuma pista quanto ao seu propósito.

O único truque real aqui é certificar-se de que o html do formulário atribua esse código à variável "destinatário". Em seguida, em seu programa de e-mail, certifique-se de que cada código usado esteja definido como um alias de e-mail, que aponta para os endereços de e-mail que deseja usar. Como não há nenhum tipo de prompt no formulário para um robô ler e nenhum endereço de e-mail, ele não tem ideia do que colocar no campo do formulário em branco. Se não inserir nada no campo do formulário ou qualquer coisa exceto códigos aceitáveis, o envio do formulário falhará com um erro de "destinatário incorreto". Você pode usar um gráfico diferente em diferentes formas, embora não seja realmente necessário na minha experiência.

Obviamente, um ser humano pode resolver esse problema em um piscar de olhos, sem todos os problemas associados ao reCAPTCHA e esquemas semelhantes, mais elegantes. Se um spammer humano responder à falha do destinatário e programar o código da imagem no robô, você pode alterá-lo facilmente, uma vez que perceber que o robô foi codificado para responder. Em cinco anos de uso dessa abordagem, nunca recebi um spam de nenhum dos formulários nos quais o uso, nem recebi uma reclamação de qualquer usuário humano dos formulários. Tenho certeza de que isso poderia ser superado com a capacidade de OCR no robô, mas nunca vi isso acontecer em nenhum dos meus sites que usam formulários html. Também usei "armadilhas de spam" (código html oculto "venha aqui" que aponta para minhas políticas anti-spam) com bons resultados, mas elas foram apenas cerca de 90% eficazes.

user2643367
fonte
1

Estou pensando em muitas coisas aqui:

  1. usando JS (embora você não queira) para rastrear o movimento do mouse, pressionamento de tecla, clique do mouse
  2. obtendo o URL de referência (que neste caso deve ser do mesmo domínio) ... o usuário normal deve navegar pelo site antes de chegar ao formulário de contato: PHP: Como obter o URL de referência?
  3. usando uma variável $ _SESSION para adquirir o IP e verificar o envio do formulário em relação à lista de IPs
  4. Preencha um campo de texto com algum texto fictício que você pode verificar no lado do servidor se ele foi substituído
  5. Verifique a versão do navegador: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... É claro que um bot não usa um navegador, mas apenas um script .
  6. Use AJAX para enviar os campos um a um e verificar a diferença de tempo entre os envios
  7. Use uma página falsa antes / depois do formulário, apenas para enviar outra entrada
valicu2000
fonte
Você poderia explicar algumas dessas etapas valicu2000? Eles ainda são válidos em 2020? Obrigado.
Michael Moriarty
0

Outra opção em vez de fazer letras e números aleatórios como muitos sites fazem, é fazer imagens aleatórias de objetos reconhecíveis. Em seguida, peça ao usuário para digitar a cor de algo na imagem ou qual é o objeto em si.

Em suma, cada solução terá suas vantagens e desvantagens. Você terá que encontrar uma média feliz entre a dificuldade de os usuários passarem no mecanismo antispam e o número de bots de spam que podem passar.

Brian
fonte
Boa ideia. Eu não usaria cor como critério, pois isso pode excluir usuários daltônicos
Neil Aitken
Sim, bom ponto. Na verdade, um problema com imagens em geral é que elas não são acessíveis e, ao torná-las "acessíveis" com alt tags, os robôs podem facilmente descobri-las.
Brian,
As imagens são sempre uma má ideia ... mal se lê o texto, enfrentei este problema com outros sites
valicu2000
Este é apenas um captcha com um pequeno toque que torna mais difícil para os usuários. Também não é acessível de todo.
Mihai P.
0

Os robôs não podem executar JavaScript, então você faz algo como injetar algum tipo de elemento oculto na página com JavaScript e, em seguida, detectar sua presença antes do envio do formulário, mas tome cuidado porque alguns de seus usuários também terão o JavaScript desativado

Caso contrário, acho que você será forçado a usar uma forma de prova do cliente de "humanidade"

Nick Allen
fonte
4
Robôs inteligentes podem executar javascript. Ao fazer uma solução de javascript, você está bloqueando 99% dos robôs
Ben Scheirman
Se o bot for um plugin de navegador, ele será capaz de executar javascript e ver coisas que o usuário vê (mesmo se você estiver fazendo renderização em flash ou webgl)
CoffeDeveloper
Apenas use CSS para colocar o campo de texto acima da página se você estiver preocupado com o fato de as pessoas estarem com o JavaScript desativado.
Chewie The Chorkie
0

A melhor solução que encontrei para evitar o spam de bots é usar uma questão ou campo muito trivial em seu formulário.

Experimente adicionar um campo como este:

  • Copie "olá" na caixa ao lado
  • 1 + 1 =?
  • Copie o nome do site na caixa

Esses truques exigem que o usuário entenda o que deve ser inserido no formulário, tornando muito mais difícil ser alvo de um grande preenchimento de formulários de bot.

EDITAR

A parte de trás deste método, como você afirmou em sua pergunta, é a etapa extra para o usuário validar seu formulário. Mas, na minha opinião, é muito mais simples que um captcha e a sobrecarga ao preencher o formulário não é superior a 5 segundos, o que parece aceitável do ponto de vista do usuário.

Thibault Falise
fonte
Como usuário, odeio essa porcaria. Eu recebo que spam é um problema, mas como é meu problema, como usuário do site? O spam de comentários é um problema para o proprietário do site e, como tal, o usuário não deve se preocupar em evitá-lo. Se você entrasse em uma loja e fosse solicitado a colocar botinhas protetoras sobre os sapatos porque eles não queriam esfregar, o que você pensaria então? Leva apenas alguns segundos, mas não é seu fardo para carregar.
Mike
@Miki spam faz o proprietário do site perder tempo. Tempo é dinheiro, o que eu vendo vai ficar mais caro pra você. Seu argumento pode ser facilmente usado para dizer que "Eu não me importo que você tenha que pagar aluguel, eu quero pagar custo de produção + 1 $. Como você está pagando aluguel é meu problema". Quando você compra algo, você paga por hospedagem, transporte, tempo etc.
Mihai P.
@Mike - O problema é seu porque você quer que o formulário funcione (obviamente, já que você está usando). As máquinas encontram até os sites mais obscuros e enviam spam dezenas de milhares de envios por dia, tornando esses formulários inutilizáveis. Então, da próxima vez que você enviar uma pergunta para uma pequena empresa usando um formulário em seu site e você terá que adicionar 9 + 3 para fazer isso ... e se perguntar "por que eu tenho que fazer isso?" sua resposta pode ser "porque eu realmente quero uma resposta para minha pergunta".
Jimbo Jonny
@JimboJonny Você não entendeu nada. Spam é um problema (como afirmei), mas existem maneiras de resolvê-lo no back-end que não prejudicam a experiência do usuário. Atualmente, tenho formulários de contato implantados em dezenas (centenas, até) de sites, e o spam é mínimo (algumas mensagens de spam por mês, por formulário) porque abordei o spam de maneira programática, não fazendo os usuários saltarem através de obstáculos. Meu ponto não é que o spam não seja um problema; É um problema. Meu ponto é que existem maneiras de lidar com isso sem falsificar a experiência do usuário.
Mike
@JimboJonny Caso em questão, veja as respostas com melhor classificação (e aceitas) nesta questão. Nenhum envolve qualquer tipo de entrada do usuário. É assim que deve ser a mitigação de spam.
Mike
0

Há um tutorial sobre isso no site JQuery. Embora seja JQuery, a ideia é independente do framework.

Se o JavaScript não estiver disponível, você pode precisar recorrer à abordagem do tipo CAPTCHA.

Piscina
fonte
0

a maneira fácil que descobri de fazer isso é colocar um campo com um valor e pedir ao usuário que remova o texto desse campo. já que os bots apenas os preenchem. se o campo não estiver vazio, significa que o usuário não é humano e não será postado. é a mesma finalidade de um código captcha.

Mateus
fonte
0

É só uma ideia, id usou isso em meu aplicativo e funciona bem

você pode criar um cookie no movimento do mouse com javascript ou jquery e no lado do servidor verificar se o cookie existe, porque somente humanos têm o mouse, o cookie pode ser criado somente por eles o cookie pode ser um carimbo de data / hora ou um token que pode ser validado

h0mayun
fonte
Ideia interessante! Você já usou isso no mundo real?
skybondsor
Não vai funcionar. Atualmente, os spammers estão usando um software que é executado no navegador. Assim, eles podem imitar a experiência do usuário que cria o cookie e, em seguida, executá-lo x várias vezes usando conteúdo diferente gerado pelo software.
Norbert Norbertson
Isso não funcionaria se o usuário não estivesse usando um mouse. Se o seu formulário estiver configurado corretamente, o usuário deve ser capaz de preencher todo o formulário usando o teclado. Você pode ir para os próximos campos, usar a barra de espaço para selecionar os botões de opção e usar a barra de espaço (ou inserir) ao acessar o botão de envio.
Kenny Johnson
0

Use 1) formulário com tokens 2) Verifique o formulário para formar o atraso com o endereço IP 3) Bloquear IP (opcional)

Vivian
fonte
0

Na minha experiência, se o formulário é apenas um formulário de "contato", você não precisa de medidas especiais. O spam é filtrado decentemente por serviços de webmail (você pode rastrear solicitações de webform por meio de scripts de servidor para ver o que efetivamente chega ao seu e-mail, é claro que presumo que você tenha um bom serviço de webmail: D)

A propósito, estou tentando não depender de sessões para isso (como, contando quantas vezes um botão é clicado para evitar sobrecargas).

Não acho isso bom. Na verdade, o que eu quero alcançar é receber e-mails de usuários que realizam alguma ação específica porque esses são os usuários nos quais estou interessado (por exemplo, usuários que consultaram a página "CV" e usaram o contato adequado Formato). Então, se o usuário faz algo que eu quero, eu começo a rastrear sua sessão e defino um cookie (sempre defino o cookie de sessão, mas quando não inicio uma sessão, é apenas um cookie falso feito para acreditar que o usuário tem uma sessão). Se o usuário faz algo indesejado, não me preocupo em manter uma sessão para ele, então não sobrecarrega etc.

Além disso, seria bom para mim que os serviços de publicidade oferecessem algum tipo de API (talvez já exista) para ver se o usuário "olhou para o anúncio", é provável que os usuários que olham os anúncios sejam usuários reais, mas se não são muito bem, pelo menos você consegue 1 visualização de qualquer maneira, então nada de perda. (e acredite em mim, os controles de anúncios são mais sofisticados do que qualquer coisa que você possa fazer sozinho)

CoffeDeveloper
fonte
0

Na verdade, a armadilha com display: nenhuma funciona como um encanto. Isso ajuda a mover a declaração CSS para um arquivo contendo qualquer folha de estilo global, o que forçaria os bots de spam a carregá-los também (uma declaração de estilo direto = "display: none;" provavelmente poderia ser interpretada por um bot de spam, assim como um declaração de estilo local dentro do próprio documento).

Isso, combinado com outras contramedidas, deve tornar discutível para qualquer bot de spam descarregar seu lixo (tenho um livro de visitas protegido por uma variedade de medidas, e até agora eles caíram em minhas armadilhas primárias - no entanto, se algum bot contorná-las, estão outros prontos para serem acionados).

O que estou usando é uma combinação de campos de formulário falsos (também descritos como campos inválidos no caso de um navegador usado que não manipula CSS em geral ou exibe: nenhum em particular), verificações de integridade (ou seja, é o formato da entrada válido?), carimbo de data / hora (envios muito rápidos e muito lentos), MySQL (para implementar listas negras com base em endereços de e-mail e IP, bem como filtros de inundação), DNSBLs (por exemplo, SBL + XBL de Spamhaus), análise de texto ( por exemplo, palavras que são uma forte indicação de spam) e e-mails de verificação (para determinar se o endereço de e-mail fornecido é válido ou não).

Uma observação sobre e-mails de verificação: esta etapa é totalmente opcional, mas quando alguém decide implementá-la, este processo deve ser o mais fácil de usar possível (ou seja, deve se resumir a clicar em um link contido no e-mail ) e fazer com que o endereço de e-mail em questão seja incluído na lista de permissões por um determinado período de tempo para que verificações subsequentes sejam evitadas caso o usuário queira fazer postagens adicionais.

Robidu
fonte
0
  1. Eu uso um método em que há uma caixa de texto oculta. Como os bots analisam o site, provavelmente o preenchem. Então eu verifico se está vazio, se não é o site retorna.

  2. Adicione verificação de e-mail. O usuário recebe um e-mail e precisa clicar em um link. Caso contrário, descarte a postagem em algum tempo.

biscoito
fonte
0

Eu adicionei uma verificação de tempo aos meus formulários. Os formulários não serão enviados se forem preenchidos em menos de 3 segundos e isso funcionou muito bem para mim, especialmente para os formulários longos. Aqui está a função de verificação de formulário que chamo no botão de envio

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}
Harika Y
fonte
0

Com bots de spam cada vez mais sofisticados e técnicas como navegadores automatizados, será mais difícil determinar a origem do spam. Mas, seja postado por software, por um ser humano ou por ambos, o spam é spam por causa de seu conteúdo. Acho que a melhor solução é executar o conteúdo postado por meio de uma API anti-spam como Cleantalk ou Akismet. É relativamente barato e eficaz e não incomoda o usuário. Você pode verificar os tempos de envio do formulário e outras verificações tradicionais para bots menos sofisticados antes de acessar a API.

nmit026
fonte
Por curiosidade, o que você acha do reCAPTCHA? Você é a primeira menção a outros serviços pagos, mas como eles se comparam ao reCAPTCHA e / ou por que você os recomendaria SOBRE o serviço gratuito?
Hawkeye
0

Você pode tentar enganar robôs de spam adicionando o atributo de ação correto após a validação de Javascript. Se o robô bloquear o Javascript, ele nunca poderá enviar o formulário corretamente.

HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

Em seguida, adiciono um "retorno de chamada" após .attr () para evitar erros.

Santi Nunez
fonte
-1

Apenas meus cinco centavos. Se o objetivo disso é parar 99% dos robôs, o que parece muito bom, e se 99% dos robôs não podem executar Java-script, a melhor solução que supera tudo é simplesmente não usar um formulário que tem uma ação de enviar com um URL de postagem.

Se o formulário for controlado por java-script e o java-script coletar os dados do formulário e enviá-los por meio de uma solicitação HTTP, nenhum robô poderá enviar o formulário. Já o botão de envio usaria Java-script para executar o código que envia o formulário.

MartinWebb
fonte