Mitigación de bots: la guerra contra los revendedores
Los robots de zapatillas se están comiendo tu inventario. Una guía técnica para derrotar a los revendedores automatizados que utilizan Cloudflare Turnstile, Honeypots y Redis Rate Limiting.
Si lanzas un producto publicitario en Shopify (por ejemplo, una entrega limitada de zapatillas) sin protección, se agotará en 1 segundo. Esto suena como un “buen problema”. No lo es. Porque el 98% del inventario se destinó a un único revendedor en Chicago que ejecutaba un script Python. Sus clientes leales (las personas que realmente usan la marca) no obtuvieron nada. Están enojados. Ellos tuitean. Se van.
Mitigación de bots no es un ticket de TI. Es Protección de Marca. En Maison Code Paris, diseñamos sistemas de “lanzamiento justo” que garantizan que los humanos ganen.
Por qué Maison Code habla de esto
En Maison Code Paris, actuamos como la conciencia arquitectónica de nuestros clientes. A menudo heredamos stacks “modernos” construidos sin una comprensión fundamental de la escala.
Discutimos este tema porque representa un punto de inflexión crítico en la madurez de la ingeniería. Implementarlo correctamente diferencia un MVP frágil de una plataforma resistente de nivel empresarial.
Por qué Maison Code analiza la protección contra bots
Hemos luchado contra los robots más sofisticados del mundo. Hemos visto bots que pueden resolver reCAPTCHA V3. Hemos visto bots que utilizan servidores proxy residenciales para parecerse a usuarios de iPhone en 50 estados. Sabemos que “Instalar un complemento” no es suficiente. Necesitas Defensa en capas. Compartimos nuestra estrategia para que puedas prepararte para la guerra.
1. El modelo de amenaza: cómo funcionan los bots
Para detener un bot, debes pensar como un desarrollador de bots. La mayoría de los robots no “navegan” su sitio.
- Monitorizar: sondean su punto final
products.jsoncada 50 ms. - Carro: omiten la interfaz de usuario por completo y
POST /cart/add.jsdirectamente. - Pago: Utilizan “Enlaces de precarga” para autocompletar el envío/facturación.
- Proxies: Enrutan el tráfico a través de 10.000 IP residenciales (dispositivos IoT secuestrados).
- Captcha: Usan granjas de API (2Captcha) donde los humanos en las granjas de clics resuelven captchas por €0,001.
2. Capa 1: El desafío invisible (torniquete Cloudflare)
El antiguo Google reCAPTCHA (Semáforo de clics) destruye las tasas de conversión. Usamos Cloudflare Turnstile. Es “invisible”. Ejecuta un desafío de prueba de trabajo de JavaScript en segundo plano del navegador. Si el visitante es un script sin cabeza (Puppeteer/Selenium), no pasa la verificación.
Implementación en Remix (Hidrógeno)
Integramos Turnstile en el flujo de envío de “Formularios”.
// aplicación/componentes/Turnstile.tsx
importar {useEffect, useRef} desde 'reaccionar';
función de exportación Turnstile({ siteKey, action }) {
constante ref = useRef(nulo);
utilizarEfecto(() => {
si (ventana.torniquete) {
ventana.turnstile.render(ref.actual, {
clave de sitio: clave de sitio,
acción: acción, // por ejemplo, 'inicio de pago'
devolución de llamada: función (token) {
// Inyecta el token en la entrada oculta
document.getElementById('cf-token').value = token;
}
});
}
}, []);
devolver <div ref={ref} />;
}
Validación del lado del servidor
Nunca confíes en el cliente. Un bot puede enviar un token falso. Debes verificarlo con la API de Cloudflare.
// aplicación/rutas/api.checkout.ts
exportar acción de función asíncrona ({solicitud}) {
const formData = espera solicitud.formData();
const token = formData.get('cf-turnstile-response');
const ip = request.headers.get('CF-Connecting-IP');
resultado constante = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
método: 'POST',
cuerpo: nueva URLSearchParams({
secreto: proceso.env.TURNSTILE_SECRET,
respuesta: ficha,
ip remota: ip
})
});
resultado constante = esperar resultado.json();
si (!resultado.éxito) {
lanzar nueva respuesta ("Bot detectado", { estado: 403 });
}
}
3. Capa 2: El Honeypot (Simple pero Efectivo)
Los bots suelen ser tontos. Encuentran cada campo <input> y lo completan.
Añadimos un “Honey Pot”.
Un campo oculto que un humano no puede ver (CSS oculto).
Si el servidor recibe un valor en este campo, baneamos la IP al instante.
<div estilo={{ opacidad: 0, posición: 'absoluta', arriba: 0, izquierda: 0, altura: 0, ancho: 0, zIndex: -1 }}>
<label htmlFor="website_url">Sitio web</label>
<input type="text" name="website_url" tabIndex={-1} autoComplete="off" />
</div>
Nota: No utilice display: none. Los robots inteligentes ignoran los elementos “display: none”. Utilice opacidad: 0 o muévalo fuera de la pantalla (izquierda: -9999px).
4. Capa 3: Limitación de tasa (Redis Token Bucket)
Un humano no puede agregar un artículo al carrito 50 veces en 1 segundo. Implementamos una estricta limitación de velocidad en la capa de aplicación (Vercel Middleware). Usamos Redis (Upstash) para realizar un seguimiento del recuento de solicitudes.
Algoritmo: Ventana deslizante.
- Clave:
ratelimit:ip:192.168.1.1 - Límite: 5 solicitudes / 10 segundos.
// middleware.ts
importar { Redis } desde '@upstash/redis';
importar { Ratelimit } desde '@upstash/ratelimit';
límite de tasa constante = nuevo límite de tasa ({
redis: Redis.fromEnv(),
limitador: Ratelimit.slidingWindow(5, '10 s'),
});
exportar middleware de función asíncrona predeterminada (solicitud) {
ip const = solicitud.ip || '127.0.0.1';
const {éxito} = esperar ratelimit.limit(ip);
si (!éxito) {
devolver nueva respuesta ("Demasiadas solicitudes", { estado: 429 });
}
}
Costo: Esto agrega ~20 ms de latencia. Solo lo aplicamos a rutas de mutación (POST), no a rutas de lectura (GET).
5. Capa 4: La sala de espera virtual (cola)
A veces, el tráfico es real (100.000 fans reales). Este es un ataque DDoS por amor. Su base de datos fallará. Para solucionar esto, implementamos un Sistema de colas (como Queue-it, pero personalizado).
- Punto de estrangulamiento: todo el tráfico llega al borde.
- Verificación de capacidad: “¿Es
active_users < 1000?” - Redireccionamiento: si está lleno, redirige a la página HTML estática
/waiting-room. - Encuesta: El cliente encuesta
/api/status. - Admitir: cuando se abra la capacidad, emita una cookie JWT firmada (
queue_pass).
Esto garantiza que tus llamadas a la API de Shopify nunca excedan el límite de aceleración.
6. La carrera armamentista: análisis del comportamiento
Los robots avanzados (sigilosos) imitan perfectamente las huellas dactilares del navegador. Pasamos a Biometría del Comportamiento. Realizamos un seguimiento:
- Trayectoria del ratón: los humanos se mueven eficazmente en curvas. Los robots se mueven en línea recta o se teletransportan.
- Tiempo de pulsación de teclas: los seres humanos tienen espacios variables entre las pulsaciones de teclas. Los robots escriben a intervalos exactos de 50 ms.
- Acelerómetro: Los dispositivos móviles tiemblan ligeramente. Los servidores no.
Enviamos esta telemetría a un motor de fraude (Sift/Forter).
7. La economía del uso de bots
¿Por qué la gente hace bots? Ganancia. Un par de Jordan Travis Scotts se vende por 150 dólares. Se revende por €1,200. Ganancia: €1,050 por par. Si un bot consigue 50 pares, eso supone una ganancia de 50.000 dólares en 1 hora. Por eso gastan 5.000 dólares en licencias de bots (CyberAIO) y 1.000 dólares en proxies. Nuestro trabajo: Hacer que el costo de ganar sea > €1,200. Hacemos esto introduciendo “aleatoriedad” (rifas) y “fricción” (verificaciones de antigüedad de la cuenta). “Solo las cuentas creadas hace más de 3 meses pueden comprar este producto”. Esto acaba con la estrategia “Girar 1000 cuentas hoy”.
8. Cifrado del lado del cliente (protección de carga útil)
A los bots les encanta aplicar ingeniería inversa a su API.
Supervisan la pestaña Red. Ven POST /cart {id: 123}.
Lo replican en Python.
Defensa: cifra la carga útil.
- Módulo WASM: compilamos una función de cifrado de C++ en WebAssembly.
- Cifrado: El navegador cifra la carga útil del carrito
enc_abcd123.... - Descifrado: el servidor utiliza la clave privada para descifrar. Los bots no pueden ejecutar WASM fácilmente (requiere un entorno de navegador completo). No pueden aplicar ingeniería inversa al código C++ (es binario). Esto eleva significativamente el listón.
9. Acción Legal (Cesar y Dessistir)
A veces, la tecnología falla. Si un proveedor de bot específico (por ejemplo, “Dragon AIO”) se dirige específicamente a usted, involúcrese legalmente. Nike demandó a StockX. Ticketmaster demandó a los revendedores. Actualice sus Términos de servicio: “El uso de software de automatización es un incumplimiento de contrato”. Esto le permite anular pedidos legalmente sin reembolsar los gastos de envío. Hazlo doloroso. Los botters son negocios. Si aumenta su riesgo legal, se mueven hacia un objetivo más fácil.
10. Conclusión
La mitigación de bots es una guerra económica. No puedes detener el 100% de los bots. Su objetivo es aumentar el Costo del ataque por encima del Beneficio potencial. Si comprar una licencia de bot cuesta €500, y los proxies cuestan €50, y la ganancia por revender su zapato es solo €200… los botters desaparecerán.
**[Contrate a nuestros arquitectos](/contact)**.