¿Cómo evitar que los robots llenen automáticamente un formulario?


105

Estoy tratando de encontrar un mecanismo antispam lo suficientemente bueno para evitar entradas generadas automáticamente. He leído que técnicas como captcha, 1 + 1 =? las cosas funcionan bien, pero también presentan un paso extra que impide el uso rápido y gratuito de la aplicación (no estoy buscando nada de eso por favor).

Intenté configurar algunos campos ocultos en todos mis formularios, con display: none; Sin embargo, estoy seguro de que se puede configurar un script para rastrear la identificación del campo del formulario y simplemente no completarlo.

¿Implementas / conoces un buen método anti-robots de llenado automático de formularios? ¿Hay algo que se pueda hacer sin problemas con el procesamiento del lado del servidor y / o HTML y que sea (casi) a prueba de balas? (sin JS, ya que uno podría simplemente deshabilitarlo).

Estoy tratando de no depender de las sesiones para esto (es decir, contar cuántas veces se hace clic en un botón para evitar sobrecargas).


5
¡Gracias por no querer soluciones captcha! En mi opinión, el spam de formularios es un problema para los propietarios de sitios y evitarlo no es una carga que el usuario deba soportar. Hay demasiadas formas alternativas en las que podemos abordar el spam en el sitio, como lo demuestran las respuestas aquí. Los métodos que requieren la interacción del usuario solo deben ser utilizados por los perezosos o los novatos.
Mike

Respuestas:


73

Una forma fácil de implementar pero no infalible (especialmente en ataques "específicos") de resolver el anti-spam es rastrear el tiempo entre el envío del formulario y la carga de la página.

Los bots solicitan una página, la analizan y envían el formulario. Esto es rápido

Los seres humanos escriben una URL, cargan la página, esperan antes de que la página esté completamente cargada, se desplazan hacia abajo, leen el contenido, deciden si comentar o completar el formulario, requieren tiempo para completar el formulario y enviarlo.

La diferencia de tiempo puede ser sutil; y cómo rastrear este tiempo sin cookies requiere alguna forma de base de datos del lado del servidor. Esto puede tener un impacto en el rendimiento.
También necesita ajustar el tiempo de umbral.


9
Tenga cuidado si desea permitir que los usuarios finales utilicen rellenos automáticos de formularios, como addons.mozilla.org/en-US/firefox/addon/1882, que pueden permitir un envío muy rápido. Además de captcha, cualquier cosa que moleste al usuario final generalmente no es buena, y especialmente cuando se evita que una persona en apuros vaya (muy) rápido.
copo de nieve

1
Buen punto, pero todo depende del contexto. Si el formulario es un formulario de inicio de sesión, estoy completamente de acuerdo con usted. Pero, ¿por qué desactivar el inicio de sesión de los bots? Si el contexto es un cuadro de comentarios, como este en StackOverflow, lo sé con certeza: si usa el autocompletar en un cuadro de comentarios, entonces es un spammer. Tenga en cuenta que si utiliza la función de autocompletar para las firmas, aún necesitará tiempo para escribir el contenido.
Pindatjuh

5
Tenga en cuenta que SO hace algo como esto. Edite un comentario demasiado rápido o demasiadas veces seguidas y aparecerá el mensaje "¿Eres un humano?" página.
Jakob Borg

2
Los piratas informáticos no siempre solicitarán el formulario. A veces, una URL cuidadosamente diseñada (usando GET o POST) será suficiente para publicar el formulario varias veces con poco esfuerzo.
artesano

1
Implementa esto con captcha. Si el formulario se envió demasiado rápido, presente un captcha para permitir el paso a usuarios genuinos.
Yashovardhan99

75

De hecho, encuentro que un simple campo Honey Pot funciona bien. La mayoría de los bots completan cada campos de formulario que ven, con la esperanza de sortear los validadores de campo requeridos.

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

Si crea un cuadro de texto, escóndelo en javascript, luego verifique que el valor esté en blanco en el servidor, esto elimina el 99% de los robots y no causa que el 99% de sus usuarios cualquier frustración en absoluto. El 1% restante que tiene javascript desactivado seguirá viendo el cuadro de texto, pero puede agregar un mensaje como "Deje este campo en blanco" para esos casos (si es que le interesan).

(Además, tenga en cuenta que si hace style = "display: none" en el campo, entonces es demasiado fácil para un robot simplemente ver eso y descartar el campo, por lo que prefiero el enfoque javascript).


1
¿Crees que los bots revisan el archivo css y se imaginan que se muestra: ninguno; ? Realmente prefiero no usar una solución basada en JS, ya que se puede desactivar fácilmente.
Gal

1
Parece ser una solución antigua para los webmasters que incluye toneladas de palabras clave no pertinentes para mejorar su clasificación web. Creo que los robots de rastreo de búsqueda, como los de Google, pueden imaginarse que se muestra: ninguno. ¿Por qué otros bots no podrían hacer eso?
copo de nieve

2
He usado esta técnica ahora en dos sitios que estaban siendo golpeados y los registros de bots ahora son cero 0 en ambos. No ayudará contra ataques dirigidos, pero la mayoría solo busca exploits o spam de todos modos.
nirvdrum

25
Un pequeño punto aquí: para solucionar el problema de JS, simplemente use CSS para colocar la entrada de su honeypot encima de la parte superior de la página; de esta manera, estará bien tener js deshabilitado y, para evitarlo, el bot tendrá que poder analizar CSS posicionamiento absoluto y tomar una decisión de sentido común sobre si es un honeypot o no. un poco más a prueba de balas de esta manera :)
totallyNotLizards

3
@ alexy13 sí, es más simple, pero como se indica en la respuesta, también es mucho más fácil para un bot descubrir lo que está tratando de hacer, solo pruebe una propiedad CSS. Sin embargo, si usa la estrategia de posicionamiento absoluto, el bot tiene que analizar todas sus reglas de posicionamiento y las reglas de la mayoría de los padres del elemento para poder determinar si la entrada sería visible o no, y luego averiguar si o no actuar en base a esa información, lo cual es más problemático de lo que vale para la mayoría (si no todos) los bots.
totalmenteNotLizards

22

¿Y si el Bot no encuentra ninguno form?

3 ejemplos:

  1. Inserta tu formulario usando AJAX
  • Si está de acuerdo con los usuarios que tienen JS deshabilitado y no pueden ver / enviar un formulario, puede notificarles y hacer que habiliten Javascript primero usando una declaración 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>
  • Crea un elemento form.htmly coloca tu forminterior <div id="formContainer">.

  • Dentro de la página donde necesita llamar a ese formulario, use un vacío <div id="dynamicForm"></div>y este jQuery:$("#dynamicForm").load("form.html #formContainer");

  1. Construya su formulario completamente 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 cebo de bot
  • A los bots les gustan ( realmente les gustan) los 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
`dsaZusil@kddGDHsj.com`
  • Después de usar el HTML anterior, también puede usar CSS para no mostrar la entrada:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • Ahora que su entrada no es visible para el usuario, espere en PHP que $_POST["email"] esté vacío (sin ningún valor)! De lo contrario, no envíe el formulario.
  • Finalmente, todo lo que necesita hacer es crear otra entrada como <input name="sender" type="text" placeholder="Your email"> después (!) La entrada "bot-bait" para la dirección de correo electrónico del usuario real.

Expresiones de gratitud:

Developer.Mozilla - Desactivar formulario de autocompletar
StackOverflow - Ignorar Tabindex


7
¿Podría el navegador de un usuario legítimo ver potencialmente el campo de entrada de cebo como un campo de correo electrónico y autocompletarlo automáticamente cuando el usuario elige autocompletar el resto del formulario? El usuario no vería que se ha llenado un campo lejos de la pantalla y aún se vería como un bot.
wilbbe01

Sospecho autocomplete=nopeque por defecto sería on;-) MDN: input # attr-autocomplete
manejar

@handle no importa, es una entrada de cebo de bot. Puede escribir autocomplete="oh sunny day"para el caso.
Roko C. Buljan

19

Lo que hice fue usar un campo oculto y ponerle la marca de tiempo y luego compararlo con la marca de tiempo en el Servidor usando PHP.

Si fue más rápido que 15 segundos (depende de qué tan grandes o pequeños sean sus formularios), eso fue un bot.

Espero que esto ayude


1
Sin embargo, es una buena idea, establecería el límite en aproximadamente 3 a 5 segundos para permitir usuarios rápidos / avanzados. Utilizo este mismo enfoque y establezco un límite de 3 segundos en mis formularios para filtrar el 99% de los bots.
Kayla

@adnhack ¿Te refieres a algo como: 1) en la carga de la página con php obtener la hora del servidor y crear la sesión. 2) el usuario o bot llena el formulario, hace clic en Enviar y $.postenvía todo a un archivo php externo. 3) en php externo, ¿obtener nuevamente la hora del servidor y compararla con la hora de la sesión?
Andris

16

Una forma muy eficaz de eliminar virtualmente el spam es tener un campo de texto que contenga texto como "¡Elimine este texto para enviar el formulario!" y ese texto debe eliminarse para poder enviar el formulario.

Tras la validación del formulario, si el campo de texto contiene el texto original o cualquier texto aleatorio, no envíe el formulario. Los bots pueden leer los nombres de los formularios y completar automáticamente los campos de Nombre y Correo electrónico, pero no saben si realmente tienen que eliminar el texto de un campo determinado para enviarlos.

Implementé este método en nuestro sitio web corporativo y eliminó totalmente el spam que recibíamos a diario. ¡Realmente funciona!


Interesante, ¿sabes si es más efectivo que las otras respuestas ... un cuadro de texto oculto o un seguimiento del tiempo que lleva completar el formulario?
Austin Henley

4
Esto también atraparía a aquellos usuarios que no pueden seguir instrucciones, lo que puede no ser deseado.
wilbbe01

¡Me gusta esto! Hasta que el bot comience a probar diferentes combinaciones de campos en blanco y completos ... la mejor manera de probar es implementar esto y escanear con uno de estos: sectoolmarket.com/…
nmit026

Efectivo en la medida en que la persona que administra el bot no se entera y modifica el código.
Talha Awan

11

¿Qué tal crear un cuadro de entrada de campo de texto del mismo color que el fondo que debe permanecer en blanco? Esto solucionará el problema de la pantalla de lectura de un bot: ninguno


2
Agregue esto como comentario por favor cuando obtenga más reputación en lugar de una respuesta;)
Rob

3
Esto presenta problemas de accesibilidad. El índice de honeypot no se ocultará a los usuarios con lectores de pantalla.
Otterfan

5
Soy un usuario ciego y encontré un campo de formulario como este una vez, y la etiqueta de arriba decía: "Si puede ver esto, déjelo en blanco". En mi opinión muy eficaz.
Parham Doustdar

8

http://recaptcha.net/

reCAPTCHA es un servicio antibot gratuito que ayuda a digitalizar libros

Ha sido adquirido por Google (en 2009):

Ver también


5
Como usuario, muchas veces encuentro que recaptcha es difícil de entender. Algunas de las palabras son tan difíciles de leer que terminas teniendo que intentarlo 3 o 4 veces. Aunque esto definitivamente ayudará con el problema de los robots.
Brian


Me encontré en esta página porque CAPTCHA / reCAPTCHA actualmente no detiene el envío de formularios de bot. Esto es 5 años después y es una técnica nueva que cuando se dio esta respuesta
JohnnyFaldo

Me sorprende que esta respuesta no tenga más votos a favor. le guste o no al usuario, esta es una gran solución. Especialmente, si solo se usa para el formulario de registro.
towi_parallelism

En estos días, recaptcha comienza como una simple casilla de verificación, ¿quizás no es tan doloroso como solía ser? ...
rogerdpack

6

Muchos de esos robots de spam son solo scripts del lado del servidor que merodean por la web. Puede combatir muchos de ellos usando javascript para manipular la solicitud del formulario antes de que se envíe (es decir, estableciendo un campo adicional basado en alguna variable de cliente). Esta no es una solución completa y puede ocasionar muchos problemas (por ejemplo, usuarios sin javascript, en dispositivos móviles, etc.), pero puede ser parte de su plan de ataque.

Aquí hay un ejemplo 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>

En algún lugar de su script php ...

<?php

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

?>

Además, los captchas son geniales y realmente la mejor defensa contra el spam.


Gracias, aunque javascript se puede desactivar fácilmente en cualquier navegador, aniquilando así mi "mecanismo anti-spam", así que estoy buscando algo más global.
Gal

Puede que me equivoque, pero ¿no le diría esto a todos los usuarios discapacitados de JS 'eres un mal cliente, vete por favor'?
Gal

Gal, es un ejemplo trivial , simplemente demuestra cómo validar contra una solicitud var establecida por js del lado del cliente.
John Himmelman

@John Himmelman Las captchas se pueden resolver y no necesariamente son la mejor defensa contra el spam. Hay servicios de pago como anti-captcha.com que resolverán captchas de formularios por una tarifa baja.

El problema con este enfoque es que he visto muchos bots usando PhantomJS. Esto les permitiría pasar.
Parham Doustdar

4

Me sorprende que nadie haya mencionado este método todavía:

  • En su página, incluya una imagen pequeña y oculta.
  • Coloque una galleta al servir esta imagen.
  • Al procesar el envío del formulario, verifique la cookie.


Pros:

  • conveniente para el usuario y el desarrollador
  • parece ser confiable
  • sin JavaScript

Contras:

  • agrega una solicitud HTTP
  • requiere que las cookies estén habilitadas en el cliente


Por ejemplo, este método es utilizado por el complemento de WordPress Cookies para comentarios .


¿No podrían los bots que usan cosas como PhantomJS evitar esto fácilmente?
Parham Doustdar

1
Como es un motor de navegador completo, que carga activos y demás, eso debería ser posible. Aún así, no estoy seguro de que se use a menudo para un bot de spam, ya que probablemente sea mucho más lento que los scripts cURL.
Gras Double

¿Por alguna razón esto sería mejor que un token CSRF?
xenoterracide

1
un token CSRF no detendrá a un bot en absoluto. Primera solicitud, OBTENGA el formulario, que incluye el token. Segunda solicitud, PUBLIQUE el formulario, incluido el token.
Gras Double

4

Con la aparición de navegadores sin cabeza (como phantomjs) que pueden emular cualquier cosa, no se puede suponer que:

  • los bots de spam no usan javascript,
  • puede rastrear los eventos del mouse para detectar bot,
  • no verán que un campo está oculto visualmente,
  • no esperarán un tiempo determinado antes de enviar.

Si eso solía ser cierto, ya no lo es.

Si no desea una solución fácil de usar, simplemente dele un hermoso botón de envío "Soy un 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" />

Por supuesto puedes jugar con dos input[type=image]botones de imagen , cambiando el orden después de cada carga, las alternativas de texto, el contenido de las imágenes (y su tamaño) o el namede los botones; que requerirá algún trabajo de 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 razones de accesibilidad, hay que poner una alternativa textual correcta, pero creo que una oración larga es mejor para los usuarios lectores de pantalla que ser considerado un bot.

Nota adicional: estos ejemplos ilustran que entender inglés (o cualquier idioma) y tener que hacer una elección simple es más difícil para un spambot que: esperar 10 segundos, manejar CSS o javascript, saber que un campo está oculto, emular el movimiento del mouse o emulando la escritura del teclado, ...


Me parece que el mero hecho de que tenga que poner el texto alternativo significa que su solución de dos imágenes es tan susceptible a las secuencias de comandos como las otras alternativas. Y para el botón "No soy un spammer": ¿no se puede programar también?
Hawkeye

@Hawkeye Mi respuesta fue que un navegador sin cabeza puede emular cualquier cosa : javascript, retrasos, movimiento del mouse, campos ocultos, ... El término "hermoso" antes de mis ejemplos era algo "sarcástico". Pero esos ejemplos ilustran que entender inglés y tener que hacer una elección simple es más difícil para un spambot que: esperar 10 segundos, manejar CSS o javascript, saber que un campo está oculto, emular el movimiento del mouse o emular la escritura del teclado, ...
Adam

Ahora veo tu punto. Tal vez agregue la última declaración "Pero esos ejemplos ilustran ...", etc. a su respuesta. Porque eso me ayudó a entender lo que quieres decir. Al principio parecía ser un argumento contradictorio de que "no podemos asumir que los bots no pueden ..." pero luego enumeramos las cosas que todavía no podemos asumir que los bots no pueden hacer. Pero el quid de su punto es que su ejemplo (tener que elegir qué botón de envío) es más difícil, lo cual (ahora que lo entiendo) es una respuesta brillante. +1
Hawkeye

3

Una forma muy sencilla es proporcionar algunos campos como <textarea style="display:none;" name="input"></textarea> y descartar todas las respuestas que lo tengan completado.

Otro enfoque es generar el formulario completo (o solo los nombres de los campos) usando Javascript; pocos bots pueden ejecutarlo.

De todos modos, no harás mucho contra los "bots" en vivo de Taiwán o India, a los que se les paga $ 0.03 por un enlace publicado, y se ganan la vida de esa manera.


2
Sé que esta respuesta tiene casi 7 años, pero creo que vale la pena comentarla. Muchos bots pueden programarse para ignorar campos con un estilo = "display: none" para evitar este tipo de protección.
Kenny Johnson

Hay docenas de métodos para ocultar entradas, usar Javascript, mostrar elementos ficticios encima de ellos, moverlos fuera del área visible, diseñarlos para que se combinen perfectamente con las decoraciones de fondo o diseño, etc. of hashed => original en la sesión del lado del servidor) ayudará a no usar nombres como sugerencias y mapear manualmente qué entradas son válidas. Independientemente, no existe ninguna defensa contra el spam manual.
SF.

2

Tengo un enfoque simple para detener a los spammers que es 100% efectivo, al menos en mi experiencia, y evita el uso de reCAPTCHA y enfoques similares. Pasé de cerca de 100 spam por día en uno de los formularios html de mis sitios a cero durante los últimos 5 años una vez que implementé este enfoque.

Funciona aprovechando las capacidades ALIAS de correo electrónico de la mayoría de los scripts de manejo de formularios html (yo uso FormMail.pl), junto con un "código" de envío gráfico, que se crea fácilmente en el programa de gráficos más simple. Uno de estos gráficos incluye el código M19P17nH y el mensaje "Introduzca el código de la izquierda".

Este ejemplo en particular usa una secuencia aleatoria de letras y números, pero tiendo a usar versiones de palabras que no están en inglés y que son familiares para mis visitantes (por ejemplo, "pnofrtay"). Tenga en cuenta que la solicitud del campo del formulario está integrada en el gráfico, en lugar de aparecer en el formulario. Por lo tanto, para un robot, ese campo de formulario no presenta ninguna pista sobre su propósito.

El único truco real aquí es asegurarse de que su formulario html asigne este código a la variable "destinatario". Luego, en su programa de correo, asegúrese de que cada código que use esté configurado como un alias de correo electrónico, que apunte a las direcciones de correo electrónico que desee usar. Dado que no hay ningún aviso de ningún tipo en el formulario para que un robot lo lea y no hay direcciones de correo electrónico, no tiene idea de qué poner en el campo del formulario en blanco. Si no pone nada en el campo del formulario ni nada excepto códigos aceptables, el envío del formulario falla con un error de "destinatario incorrecto". Puede usar un gráfico diferente en diferentes formas, aunque en mi experiencia no es realmente necesario.

Por supuesto, un ser humano puede resolver este problema en un instante, sin todos los problemas asociados con reCAPTCHA y esquemas similares, más elegantes. Si un spammer humano responde a la falla del destinatario y programa el código de imagen en el robot, puede cambiarlo fácilmente, una vez que se dé cuenta de que el robot ha sido codificado para responder. En cinco años de usar este enfoque, nunca he recibido un correo no deseado de ninguno de los formularios en los que lo uso ni he tenido una queja de ningún usuario humano de los formularios. Estoy seguro de que esto podría superarse con la capacidad de OCR en el robot, pero nunca me ha sucedido en ninguno de mis sitios que usan formularios html. También he utilizado "trampas de spam" (código html oculto "ven aquí" que apunta a mis políticas anti-spam) con buenos resultados, pero solo fueron efectivas en un 90%.


1

Estoy pensando en muchas cosas aquí:

  1. usando JS (aunque no lo desee) para rastrear el movimiento del mouse, presionar una tecla, hacer clic en el mouse
  2. obteniendo la URL de referencia (que en este caso debería ser una del mismo dominio) ... el usuario normal debe navegar por el sitio web antes de llegar al formulario de contacto: PHP: ¿Cómo obtener la URL de referencia?
  3. usando una variable $ _SESSION para adquirir la IP y verificar el envío del formulario con esa lista de IP
  4. Complete un campo de texto con un texto ficticio que pueda verificar en el lado del servidor si se ha sobrescrito
  5. Verifique la versión del navegador: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Está claro que un bot no usará un navegador sino solo un script .
  6. Use AJAX para enviar los campos uno por uno y verifique la diferencia de tiempo entre envíos
  7. Use una página falsa antes / después del formulario, solo para enviar otra entrada

¿Podría explicar algunos de estos pasos valicu2000? ¿Siguen siendo válidos en 2020? Gracias.
Michael Moriarty

0

Otra opción en lugar de hacer letras y números aleatorios como hacen muchos sitios web, es hacer imágenes aleatorias de objetos reconocibles. Luego, pida al usuario que escriba de qué color es algo en la imagen o qué es el objeto en sí.

En general, cada solución tendrá sus ventajas y desventajas. Tendrá que encontrar una mediana feliz entre demasiado difícil para que los usuarios pasen el mecanismo antispam y la cantidad de bots de spam que pueden pasar.


Buena idea. Sin embargo, no usaría el color como criterio, ya que esto puede excluir a los usuarios daltónicos
Neil Aitken

Sí, buen punto. En realidad, un problema con las imágenes en general es que no son accesibles y, al hacerlas "accesibles" con etiquetas alt, los robots pueden descifrarlas fácilmente.
Brian

Las imágenes siempre son una mala idea ... el texto apenas se puede leer, enfrenté este problema con otros sitios web
valicu2000

Esto es solo un captcha con un pequeño giro que lo hace más difícil para los usuarios. Además, no es accesible en absoluto.
Mihai P.

0

Los robots no pueden ejecutar JavaScript, por lo que puede hacer algo como inyectar algún tipo de elemento oculto en la página con JavaScript y luego detectar su presencia antes de enviar el formulario, pero tenga cuidado porque algunos de sus usuarios también tendrán JavaScript deshabilitado.

De lo contrario, creo que se verá obligado a utilizar una forma de prueba del cliente de "humanidad"


4
Los robots inteligentes pueden ejecutar javascript. Sin embargo
Ben Scheirman

Si el bot es un complemento del navegador, podrá ejecutar javascript y ver las cosas que ve el usuario (incluso si está haciendo una representación flash o webgl)
CoffeDeveloper

Simplemente use CSS para colocar el campo de texto encima de la página si le preocupa que las personas tengan JavaScript desactivado.
Chewie The Chorkie

0

La mejor solución que he encontrado para evitar que los bots me envíen spam es utilizar una pregunta o un campo muy trivial en su formulario.

Intente agregar un campo como estos:

  • Copia "hola" en el cuadro a un lado
  • 1 + 1 =?
  • Copie el nombre del sitio web en el cuadro

Estos trucos requieren que el usuario comprenda lo que se debe ingresar en el formulario, lo que hace que sea mucho más difícil ser el objetivo del llenado masivo de formularios mediante bot.

EDITAR

La parte trasera de este método, como indicó en su pregunta, es el paso adicional para que el usuario valide su formulario. Pero, en mi opinión, es mucho más sencillo que un captcha y la sobrecarga al rellenar el formulario no supera los 5 segundos, lo que parece aceptable desde el punto de vista del usuario.


Como usuario, odio esa basura. Entiendo que el spam es un problema, pero ¿cómo es mi problema, como usuario del sitio? El spam de comentarios es un problema para el propietario del sitio y, como tal, el usuario no debe tomar la carga de prevenirlo. Si entras en una tienda y te piden que te pongas botines protectores sobre los zapatos porque no quieren trapear, ¿qué pensarías entonces? Solo toma unos segundos, pero no es su carga para soportar.
Mike

El spam de @Miki hace que el propietario de un sitio pierda el tiempo. El tiempo es dinero, lo que vendo te saldrá más caro. Su argumento puede usarse fácilmente para decir que "no me importa que tenga que pagar el alquiler, quiero pagar el costo de producción + 1 $. ¿Cómo está pagando el alquiler mi problema". Cuando compras algo, pagas por alojamiento, transporte, tiempo, etc.
Mihai P.

@ Mike: es tu problema porque quieres que el formulario funcione (obviamente, ya que lo estás usando). Las máquinas encuentran incluso los sitios más oscuros y enviarán spam a decenas de miles de envíos al día, haciendo que esos formularios sean inutilizables. Entonces, la próxima vez que envíe una pregunta a una pequeña empresa mediante un formulario en su sitio web y tendrá que agregar 9 + 3 para hacerlo ... y pregúntese "¿por qué tengo que hacer esto?" su respuesta puede ser "porque realmente quiero una respuesta a mi pregunta".
Jimbo Jonny

@JimboJonny Perdiste mi punto por completo. El spam es un problema (como dije), pero hay formas de abordarlo en el backend que no manchan la experiencia del usuario. Actualmente tengo formularios de contacto implementados en docenas (cientos, incluso) de sitios web, y el spam es mínimo (algunos mensajes de spam al mes, por formulario) porque he abordado el spam de manera programática, no haciendo que los usuarios salten por el aro. Mi punto no era que el spam no es un problema; ES un problema. Mi punto fue que hay formas de abordarlo sin alterar la experiencia del usuario.
Mike

@JimboJonny Por ejemplo, mire las respuestas mejor clasificadas (y aceptadas) sobre esta pregunta. Ninguno implica ningún tipo de entrada del usuario. Esa es la forma en que debería ser la mitigación del spam.
Mike

0

Hay un tutorial sobre esto en el sitio de JQuery. Aunque es JQuery, la idea es independiente del marco.

Si JavaScript no está disponible, es posible que deba recurrir al enfoque de tipo CAPTCHA.


0

La forma más fácil que encontré para hacer esto es poner un campo con un valor y pedirle al usuario que elimine el texto de este campo. ya que los bots solo los llenan. si el campo no está vacío, significa que el usuario no es humano y no se publicará. es el mismo propósito de un código captcha.


0

Es solo una idea, id la usé en mi aplicación y funciona bien

puede crear una cookie en el movimiento del mouse con javascript o jquery y en el lado del servidor verifique si existe una cookie, porque solo los humanos tienen mouse, la cookie solo puede ser creada por ellos, la cookie puede ser una marca de tiempo o un token que se puede validar


¡Idea interesante! ¿Has usado esto en el mundo real?
skybondsor

No funcionará. En estos días, los spammers utilizan software que se ejecuta en el navegador. Para que puedan imitar la experiencia del usuario que crea la cookie y luego ejecutarla x número de veces utilizando contenido diferente generado por el software.
Norbert Norbertson

Esto no funcionaría si el usuario no estuviera usando un mouse. Si su formulario está configurado correctamente, el usuario debería poder completar el formulario completo con el teclado. Puede pasar a los siguientes campos, usar la barra espaciadora para seleccionar botones de opción y usar la barra espaciadora (o ingresar) cuando se tabula en el botón enviar.
Kenny Johnson

0

Utilice 1) formulario con tokens 2) Verifique el formulario para formar un retraso con la dirección IP 3) Bloquear IP (opcional)


0

En mi experiencia, si el formulario es solo un formulario de "contacto", no necesita medidas especiales. El correo no deseado se filtra de manera decente por los servicios de correo web (puede rastrear las solicitudes de formularios web a través de scripts del servidor para ver qué llega efectivamente a su correo electrónico, por supuesto, supongo que tiene un buen servicio de correo web: D)

Por cierto, estoy tratando de no depender de las sesiones para esto (como contar cuántas veces se hace clic en un botón para evitar sobrecargas).

No creo que eso sea bueno. De hecho, lo que quiero lograr es recibir correos electrónicos de usuarios que realizan alguna acción en particular porque esos son los usuarios que me interesan (por ejemplo, usuarios que vieron la página "CV" y usaron el contacto adecuado formar). Entonces, si el usuario hace algo que quiero, comienzo a rastrear su sesión y configuro una cookie (siempre configuro una cookie de sesión, pero cuando no inicio una sesión, es solo una cookie falsa hecha para creer que el usuario tiene una sesión). Si el usuario hace algo no deseado, no me molesto en mantener una sesión para él, por lo que no hay sobrecarga, etc.

También sería bueno para mí que los servicios de publicidad ofrecieran algún tipo de api (quizás ya exista) para ver si el usuario "miró el anuncio", es probable que los usuarios que miran anuncios sean usuarios reales, pero si no lo son muy bien, al menos obtienes 1 vista de todos modos, así que no hay pérdida. (y créame, los controles de anuncios son más sofisticados que cualquier cosa que pueda hacer solo)


0

En realidad, la trampa con pantalla: ninguna funciona como un encanto. Ayuda a mover la declaración CSS a un archivo que contenga cualquier hoja de estilo global, lo que obligaría a los bots de spam a cargarlos también (una declaración directa style = "display: none;" probablemente podría ser interpretada por un bot de spam, al igual que un declaración de estilo local dentro del propio documento).

Esto, combinado con otras contramedidas, debería hacer que sea discutible que los bots de spam descarguen su basura (tengo un libro de visitas asegurado con una variedad de medidas, y hasta ahora han caído en mis trampas principales; sin embargo, si algún bot las omite, hay están otros listos para disparar).

Lo que estoy usando es una combinación de campos de formulario falsos (también descritos como campos inválidos en caso de que se use un navegador que no maneja CSS en general o muestra: ninguno en particular), verificaciones de cordura (es decir, es el formato de la entrada ¿válido?), sellado de tiempo (envíos demasiado rápidos y demasiado lentos), MySQL (para implementar listas negras basadas en direcciones de correo electrónico e IP, así como filtros de inundación), DNSBL (por ejemplo, el SBL + XBL de Spamhaus), análisis de texto ( por ejemplo, palabras que son una fuerte indicación de spam) y correos electrónicos de verificación (para determinar si la dirección de correo electrónico proporcionada es válida o no).

Una nota sobre los correos electrónicos de verificación: este paso es completamente opcional, pero cuando uno elige implementarlo, este proceso debe ser lo más fácil de usar posible (es decir, debe reducirse a hacer clic en un enlace contenido en el correo electrónico ) y hacer que la dirección de correo electrónico en cuestión se incluya en la lista blanca durante un cierto período de tiempo para evitar verificaciones posteriores en caso de que el usuario desee realizar publicaciones adicionales.


0
  1. Utilizo un método donde hay un cuadro de texto oculto. Dado que los bots analizan el sitio web, probablemente lo llenen. Luego lo verifico si está vacío si no es el sitio web.

  2. Agrega verificación por correo electrónico. El usuario recibe un correo electrónico y debe hacer clic en un enlace. De lo contrario, descarte la publicación en algún momento.


0

Agregué una verificación de tiempo a mis formularios. Los formularios no se enviarán si se completan en menos de 3 segundos y esto funcionó muy bien para mí, especialmente para los formularios largos. Aquí está la función de verificación de formulario a la que llamo en el botón enviar

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

}

0

Con bots de spam cada vez más sofisticados y técnicas como los navegadores automatizados, será más difícil determinar la fuente del spam. Pero ya sea que lo publique un software, un humano o ambos, el spam es spam debido a su contenido. Creo que la mejor solución es ejecutar el contenido publicado a través de una API anti-spam como Cleantalk o Akismet. Es relativamente económico y eficaz y no molesta al usuario. Puede verificar los tiempos de envío de formularios y las otras verificaciones tradicionales para detectar bots menos sofisticados antes de ingresar a la API.


Por curiosidad, ¿cuál es tu opinión sobre reCAPTCHA? Usted es el primero en mencionar otros servicios pagos, pero ¿cómo se comparan esos con reCAPTCHA y / o por qué los recomendaría sobre el servicio gratuito?
Hawkeye

0

Puede intentar engañar a los robots de spam agregando el atributo de acción correcto después de la validación de Javascript. Si el robot bloquea Javascript, nunca podrá enviar el formulario correctamente.

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()
    });
})

Luego agrego una "devolución de llamada" después de .attr () para evitar errores.


-1

Solo mis cinco centavos. Si el objetivo de esto es detener el 99% de los robots, lo cual suena bastante bien, y si el 99% de los robots no pueden ejecutar Java-script, la mejor solución que supera a todas es simplemente no usar un formulario que tenga una acción de enviar con una URL de publicación.

Si el formulario se controla a través de java-script y el java-script recopila los datos del formulario y luego los envía a través de una solicitud HTTP, ningún robot puede enviar el formulario. Dado que el botón de envío usaría Java-script para ejecutar el código que envía el formulario.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.