Ingeniería civil y estructural
Cómo utilizar Javascript para la implementación de Captcha y la prevención del Spam
Table of Contents
Comprender el papel de CAPTCHA y su función en la prevención del espacio
CAPTCHA (Prueba de Turing Público Completamente Automatizada para decirle a Computers and Humans Apart) se ha convertido en una herramienta esencial para proteger los formularios web del abuso automatizado. Los símbolos y scripts maliciosos suelen dirigirse a los formularios de contacto, páginas de inicio y secciones de comentarios para presentar contenido no deseado o ataques de lanzamiento.Una CAPTCHA bien diseñada obliga a fracasar un desafío que la mayoría de los humanos pueden completar rápidamente, filtrando eficazmente el tráfico automatizado sin interrumpir usuarios genuinos.
Las implementaciones modernas de CAPTCHA han evolucionado más allá de las imágenes de texto distorsionadas que una vez definieron la tecnología. Con la adopción generalizada de JavaScript, los desarrolladores pueden crear desafíos interactivos, como problemas de matemáticas, rompecabezas de imágenes o tareas de arrastrar y soltar, que son más fáciles de usar y más difíciles para los robots de desvío.Este artículo explora cómo implementar CAPTCHA usando vainilla JavaScript, integra técnicas adicionales de prevención de spam y decide cuándo utilizar los servicios como terceros
Construyendo un CAPTCHA JavaScript desde Scratch
Creando un CAPTCHA personalizado con JavaScript le da control completo sobre la experiencia del usuario y la lógica de seguridad. A continuación, cubrimos tres enfoques comunes: problemas de matemáticas, deslizadores e identificación de imágenes. Cada método se puede implementar con HTML, CSS y JavaScript simple, y más tarde integrado en un flujo de validación lado del servidor.
Método 1: Problema de matemáticas CAPTCHA
El CAPTCHA más simple presenta una operación aritmética aleatoria que los usuarios deben resolver. Esto funciona bien para formas de bajo riesgo pero no está seguro contra bots avanzados que pueden parizar HTML o utilizar el reconocimiento óptico de caracteres (OCR) en números simples.
Estructura de HTML
<form id="contactForm">
<div id="captchaContainer">
<p id="captchaQuestion">Loading...</p>
<input type="number" id="captchaAnswer" placeholder="Your answer" required />
</div>
<button type="submit">Submit</button>
</form>
JavaScript logic
let captchaAnswer = 0;
function generateMathCaptcha() {
const num1 = Math.floor(Math.random() * 20) + 1;
const num2 = Math.floor(Math.random() * 10) + 1;
const operator = ['+', '-', '*'][Math.floor(Math.random() * 3)];
let expression = `${num1} ${operator} ${num2}`;
captchaAnswer = eval(expression);
document.getElementById('captchaQuestion').textContent = `What is ${expression}?`;
}
document.getElementById('contactForm').addEventListener('submit', (e) => {
e.preventDefault();
const userAnswer = parseInt(document.getElementById('captchaAnswer').value, 10);
if (userAnswer === captchaAnswer) {
// Proceed with form submission
console.log('CAPTCHA passed');
} else {
alert('Incorrect answer. Please try again.');
generateMathCaptcha();
document.getElementById('captchaAnswer').value = '';
}
});
window.addEventListener('load', generateMathCaptcha);
Limitations:] Los CAPTCHAs de Matemáticas son vulnerables a bots que ejecutan JavaScript y computan la respuesta. Para mejorar la seguridad, combinen con validación de lado servidor (descusado más tarde) y consideren la obfuscación del desafío generado de una manera que hace más difícil que los scripts extraigan la respuesta correcta.
Método 2: Slider CAPTCHA
Los desafíos del deslizante requieren que el usuario arrastre un botón a lo largo de una pista a una posición específica. Esta técnica se basa en la detección de movimientos del ratón como humano y el tiempo, lo que hace más difícil para los bots simples emular. Sin embargo, bots avanzados pueden simular eventos de arrastrar.
Aplicación básica
<div id="sliderCaptcha">
<div id="sliderTrack">
<div id="sliderThumb">→</div>
</div>
<p id="sliderStatus">Slide to verify</p>
</div>
Agregue los oyentes de eventos para , y (o equivalentes táctiles).Pulse el offset del pulgar y comparelo a la posición de destino. Un truco común es establecer aleatoriamente la posición de destino en cada página de carga y luego validar tanto la posición final como el patrón de movimiento.
Nota de seguridad:] Debido a que los bots pueden desencadenar eventos de ratón programáticamente, los CAPTCHAs deslizantes deben estar emparejados con controles de lado servidor que registran la velocidad de movimiento, la duración total y la posición final. Los bots a menudo no producen perfiles de aceleración y desaceleración naturales.
Método 3: Selección de imágenes CAPTCHA
CAPTCHAs basadas en imágenes piden a los usuarios que seleccionen todas las imágenes que se ajusten a una determinada categoría (por ejemplo, "Seleccione todas las casillas con luces de tráfico"). Mientras que más fácil de usar que el texto distorsionado, son complejas para implementar desde cero porque requieren almacenamiento en el lado del servidor de imágenes y respuestas. Considere utilizar un servicio de terceros para este enfoque, pero se puede hacer con imágenes pre-exploradas y un conjunto correcto aleatorizado.
Ejemplo simplificado:
<div id="imageGrid">
<img src="cat.jpg" class="captcha-image" data-kind="animal">
<img src="car.jpg" class="captcha-image" data-kind="vehicle">
<img src="dog.jpg" class="captcha-image" data-kind="animal">
<img src="tree.jpg" class="captcha-image" data-kind="plant">
</div>
<p>Select all images that show an animal.</p>
El JavaScript recopilaría imágenes seleccionadas y verificaría sus atributos en la presentación. Para evitar que los bots simplemente lean el HTML, los valores de atributos deben ser cifrados o generados dinámicamente desde el servidor.
Mejora de la seguridad con técnicas adicionales
Ningún cliente-side CAPTCHA es infalible; bots puede inversor JavaScript, ejecutar navegadores sin cabeza, o utilizar AI avanzada. Por lo tanto, combinar su CAPTCHA de frente con estas mejoras lado del servidor y lado del cliente.
Campos de Honeypot
Los puntos de miel son campos de forma oculta que los humanos no verán ni llenarán, pero los bots a menudo autocompletan. Agregue un campo con estilos como o . En el servidor, rechaza las sumisiones donde la fuente de miel no está vacía.
<input type="text" name="website" style="display:none" autocomplete="off">
Validación de base temporal
Los botas pueden presentar formularios en milisegundos, mientras que los humanos tardan varios segundos en leer y responder. Recordar el tiempo de generación de formularios usando JavaScript () y enviarlo junto con la presentación. En el servidor, rechazar las presentaciones que llegan más rápido que un umbral razonable (por ejemplo, 2 segundos para una forma sencilla, 5 segundos para CAPTCHA).
const FORM_GENERATED = Date.now();
// On submit:
const submissionTime = Date.now() - FORM_GENERATED;
// Include in form data and validate server-side
Validación del servidor-Side Obligatoria
Nunca confíe en la validación del lado del cliente solo. Siempre vuelva a probar la respuesta CAPTCHA en el servidor. Si usted generó el lado del desafío, también debe enviar los parámetros de desafío (por ejemplo, los números y el operador) al servidor y volver a calcular la respuesta esperada. Mejor aún, generar el desafío en el servidor, enviarlo al cliente, y validar el servidor de respuesta siempre alterar el JavaScript.
Ejemplo de flujo lado servidor para una mate CAPTCHA:
- Server genera dos números aleatorios y operador, almacena la respuesta esperada en la sesión (o la encripta).
- Server envía la pregunta al cliente.
- El usuario presenta la respuesta.
- Server recupera la respuesta almacenada y compara; si coincide, formulario de proceso.
Implementación de una CAPTCHA con Servicios Externos
Para los sitios de producción, considere utilizar servicios de CAPTCHA bien establecidos que ofrecen una protección robusta contra ataques automatizados, incluyendo reconocimiento de imagen basado en el aprendizaje automático. Dos opciones populares son Google reCAPTCHA y hCaptcha. Proporcionan tanto los niveles libres como la fácil integración a través de bibliotecas JavaScript.
reCAPTCHA v3 example:
<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
<script>
document.getElementById('contactForm').addEventListener('submit', (e) => {
e.preventDefault();
grecaptcha.ready(() => {
grecaptcha.execute('YOUR_SITE_KEY', {action: 'submit'}).then((token) => {
// Append token to form and submit
document.getElementById('recaptchaToken').value = token;
document.getElementById('contactForm').submit();
});
});
});
</script>
Estos servicios manejan todo el levantamiento pesado: detección de bots, retos adaptables y accesibilidad. También proporcionan un panel para monitorear el tráfico y ajustar los umbrales. Sin embargo, requieren una conexión a Internet con los servidores del servicio y pueden plantear preocupaciones de privacidad (especialmente el uso de cookies de reCAPTCHA). Evaluar si el trade-off es aceptable para su audiencia.
Para una guía de integración pragmática, véase Google reCAPTCHA documentación de desarrolladores.
Buenas Prácticas para la Integración CAPTCHA
- Accesibilidad:] Asegurar que los usuarios con discapacidad dispongan de alternativas CAPTCHA. Los desafíos de audio o preguntas basadas en textos que pueden ser manejados por los lectores de pantalla son esenciales para el cumplimiento de las directrices de WCAG.
- Mejora progresiva:] Comience con un formulario HTML simple, a continuación, agregue JavaScript para CAPTCHA. Si JavaScript está deshabilitado, vuelva a una imagen generada por servidor CAPTCHA o una simple consulta de matemáticas enviada a través de un campo oculto.
- Limitación de destino: Incluso con CAPTCHA, aplicar la tasa limitante en el servidor (por ejemplo, limitar las presentaciones por dirección IP por hora). Esto impide que un determinado atacante rompa manualmente la CAPTCHA.
- Logging and Monitoring: Log CAPTCHA fallas y patrones de presentación inusuales. Estos datos le ayudan a ajustar los umbrales e identificar nuevos vectores de ataque.
- Obfuscate JavaScript: Minifica y obfusa tu lógica CAPTCHA para hacer más difícil para los bots comprender la generación de desafío. Aunque no es infalible, aumenta el esfuerzo necesario para el incentivo reverso.
- Combine Multiple Techniques: Usar un enfoque estratado. Una maceta, un control de tiempo, un control deslizante y un control doble lado del servidor juntos proporcionan una protección mucho mejor que cualquier método único.
Conclusión
Implementar CAPTCHA con JavaScript le da flexibilidad para crear medidas interactivas y fáciles de usar contra el spam. Desde rompecabezas de matemáticas simples hasta retos deslizantes, estas técnicas pueden disuadir de muchos ataques automatizados, especialmente cuando se combinan con validación de lado servidor, puntos de miel y cheques basados en el tiempo. Para formas de alta tráfico o sensibilidad, considere la integración de un servicio profesional como reCAPTCHA o hCaptcha para beneficiarse de mejoras continuas en la detección de botcha.
Recuerde que la seguridad es una carrera de armamentos: como los métodos CAPTCHA mejoran, también los bots. Revisa regularmente su implementación, monitorea patrones de amenaza y actualiza sus defensas en consecuencia. Al tomar un enfoque proactivo y multicapa, puede mantener sus formas libres de spam sin sacrificar la experiencia de usuario.