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).
Respuestas:
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.
fuente
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).
fuente
¿Y si el Bot no encuentra ninguno
form
?3 ejemplos:
Crea un elemento
form.html
y coloca tuform
interior<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");
$_POST["email"]
esté vacío (sin ningún valor)! De lo contrario, no envíe el formulario.<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
fuente
autocomplete=nope
que por defecto seríaon
;-) MDN: input # attr-autocompleteautocomplete="oh sunny day"
para el caso.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
fuente
$.post
enví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?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!
fuente
¿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
fuente
http://recaptcha.net/reCAPTCHA es un servicio antibot gratuito que ayuda a digitalizar libros
Ha sido adquirido por Google (en 2009):
Ver también
fuente
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 ...
En algún lugar de su script php ...
Además, los captchas son geniales y realmente la mejor defensa contra el spam.
fuente
Me sorprende que nadie haya mencionado este método todavía:
Pros:
Contras:
Por ejemplo, este método es utilizado por el complemento de WordPress Cookies para comentarios .
fuente
Con la aparición de navegadores sin cabeza (como phantomjs) que pueden emular cualquier cosa, no se puede suponer que:
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" :
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 elname
de los botones; que requerirá algún trabajo de servidor.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, ...
fuente
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.
fuente
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%.
fuente
Estoy pensando en muchas cosas aquí:
fuente
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.
fuente
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"
fuente
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:
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.
fuente
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.
fuente
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.
fuente
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
fuente
Utilice 1) formulario con tokens 2) Verifique el formulario para formar un retraso con la dirección IP 3) Bloquear IP (opcional)
fuente
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)
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)
fuente
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.
fuente
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.
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.
fuente
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
fuente
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.
fuente
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
JAVASCRIPT
Luego agrego una "devolución de llamada" después de .attr () para evitar errores.
fuente
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.
fuente