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).
Respostas:
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.
fonte
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).
fonte
E se - o Bot não encontrar nenhum
form
?3 exemplos:
Crie um
form.html
e coloque seuform
dentro 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");
$_POST["email"]
esteja vazio (sem nenhum valor)! Caso contrário, não envie o formulário.<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
fonte
autocomplete=nope
que o padrão seriaon
;-) MDN: input # attr-autocompleteautocomplete="oh sunny day"
para esse assunto.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
fonte
$.post
envia tudo para o arquivo php externo. 3) em php externo obter novamente o tempo do servidor e comparar com o tempo da sessão?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!
fonte
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
fonte
http://recaptcha.net/reCAPTCHA é um serviço antibot gratuito que ajuda a digitalizar livros
Foi adquirido pelo Google (em 2009):
Veja também
fonte
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 ...
Em algum lugar do seu script php ...
Além disso, os captchas são ótimos e realmente a melhor defesa contra spam.
fonte
Estou surpreso que ninguém tenha mencionado esse método ainda:
Prós:
Contras:
Por exemplo, este método é usado pelo plugin do WordPress Cookies para comentários .
fonte
Com o surgimento de navegadores sem cabeça (como phantomjs) que podem emular qualquer coisa, você não pode supor que:
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" :
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 oname
dos botões; o que exigirá algum trabalho no servidor.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, ...
fonte
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.
fonte
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.
fonte
Estou pensando em muitas coisas aqui:
fonte
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.
fonte
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"
fonte
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:
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.
fonte
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.
fonte
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.
fonte
É 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
fonte
Use 1) formulário com tokens 2) Verifique o formulário para formar o atraso com o endereço IP 3) Bloquear IP (opcional)
fonte
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)
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)
fonte
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.
fonte
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.
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.
fonte
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
fonte
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.
fonte
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
JAVASCRIPT
Em seguida, adiciono um "retorno de chamada" após .attr () para evitar erros.
fonte
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.
fonte