¿Enfoques CAPTCHA prácticos no basados ​​en imágenes?

Resuelto Jeff Atwood asked hace 16 años • 103 respuestas

Parece que agregaremos compatibilidad con CAPTCHA a Stack Overflow. Esto es necesario para evitar bots, spammers y otras actividades maliciosas programadas. ¡Solo queremos que seres humanos publiquen o editen cosas aquí!

Usaremos un CAPTCHA de JavaScript (jQuery) como primera línea de defensa:

http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs

La ventaja de este enfoque es que, para la mayoría de las personas, ¡el CAPTCHA nunca será visible!

Sin embargo, para las personas con JavaScript deshabilitado, todavía necesitamos un respaldo y aquí es donde la cosa se vuelve complicada.

He escrito un control CAPTCHA tradicional para ASP.NET que podemos reutilizar.

Imagen CAPTCHA

Sin embargo, preferiría usar algo textual para evitar la sobrecarga de crear todas estas imágenes en el servidor con cada solicitud.

He visto cosas como...

  • Captcha de texto ASCII:\/\/(_)\/\/
  • acertijos matemáticos: ¿cuánto es 7 menos 3 por 2?
  • Preguntas de trivia: ¿qué sabe mejor, un sapo o una paleta helada?

Tal vez solo estoy inclinando los molinos de viento aquí, pero me gustaría tener un <noscript>CAPTCHA compatible no basado en imágenes y que requiera menos recursos, si es posible.

¿Ideas?

Jeff Atwood avatar Aug 12 '08 11:08 Jeff Atwood
Aceptado

Mi CAPTCHA favorito de todos los tiempos :

Captcha

ceejayoz avatar Aug 25 '2008 19:08 ceejayoz

Un método que he desarrollado y que parece funcionar perfectamente (aunque probablemente no recibo tantos comentarios spam como tú) es tener un campo oculto y llenarlo con un valor falso, por ejemplo:

<input type="hidden" name="antispam" value="lalalala" />

Luego tengo un fragmento de JavaScript que actualiza el valor cada segundo con la cantidad de segundos durante los cuales se cargó la página:

var antiSpam = function() {
        if (document.getElementById("antiSpam")) {
                a = document.getElementById("antiSpam");
                if (isNaN(a.value) == true) {
                        a.value = 0;
                } else {
                        a.value = parseInt(a.value) + 1;
                }
        }
        setTimeout("antiSpam()", 1000);
}

antiSpam();

Luego, cuando se envía el formulario, si el valor antispam sigue siendo "lalalala", lo marco como spam. Si el valor antispam es un número entero, verifico si está por encima de 10 (segundos). Si es inferior a 10 lo marco como spam, si es 10 o más lo dejo pasar.

If AntiSpam = A Integer
    If AntiSpam >= 10
        Comment = Approved
    Else
        Comment = Spam
Else
    Comment = Spam

La teoría es que:

  • Un robot de spam no admitirá JavaScript y enviará lo que vea
  • Si el bot admite JavaScript, enviará el formulario al instante.
  • El comentarista ha leído al menos parte de la página antes de publicar.

La desventaja de este método es que requiere JavaScript y, si no tiene JavaScript habilitado, su comentario se marcará como spam; sin embargo, reviso los comentarios marcados como spam, por lo que esto no es un problema.

Respuesta a comentarios

@MrAnalogy: El enfoque del lado del servidor parece una idea bastante buena y es exactamente igual que hacerlo en JavaScript. Buena llamada.

@AviD: Soy consciente de que este método es propenso a ataques directos, como mencioné en mi blog . Sin embargo, se defenderá contra el robot de spam promedio que envía basura ciegamente en cualquier forma que pueda encontrar.

GateKiller avatar Aug 12 '2008 09:08 GateKiller