Para 2025, el panorama digital ha cambiado: CAPTCHA ya no es el confiable guardián que solía ser. Mientras que los bots impulsados por IA resuelven los acertijos de CAPTCHA con una precisión casi perfecta, los usuarios genuinos se frustran y a menudo abandonan los sitios cuando se les desafía. Estudios recientes muestran que los bots ahora atraviesan las CAPTCHAs basadas en imágenes y texto entre el 96% y el 100% del tiempo, superando con creces las tasas de éxito humanas reales y reduciendo las conversiones de formularios hasta en un 20%. Pero el problema va mucho más allá de cualquier acertijo obsoleto.
Hoy en día, el tráfico automatizado domina la web. Lo experimento personalmente. En 2024, se estimó que casi la mitad de toda la actividad en línea fue generada por bots, con hasta un 37% clasificado como abiertamente malicioso. Incluso los sitios con mitigación activa aún informan de un 10% a un 20% de actividad de bots en curso. La realidad es clara: soluciones tradicionales como CAPTCHA y listas negras de IP se han vuelto casi impotentes frente a botnets coordinados y en rápida evolución que pueden imitar a usuarios reales, cambiar a IPs nuevas, e incluso explotar dispositivos móviles para ataques a gran escala.
Para los propietarios de sitios web y negocios en línea, el impacto es devastador. Las inundaciones de bots pueden paralizar los recursos del servidor, ralentizar la carga de páginas hasta un punto crítico y arruinar la experiencia del usuario. Pero los efectos se extienden aún más: las clasificaciones de Google caen a medida que el rendimiento de la página se desploma, los ingresos por publicidad se evaporan a medida que la calidad del tráfico declina, y las relaciones con los socios publicitarios se deterioran cuando las visitas falsas inundan sus análisis.
Experimenté esta crisis de primera mano. Todo comenzó con una acusación de una agencia de publicidad: afirmaron que el 90% del tráfico de mi sitio era falso. Su código de seguimiento, incrustado para la entrega de anuncios, reveló volúmenes de bots que estaban abrumando no solo sus filtros sino también mi servidor. Estamos hablando de más de un millón de visitas de bots por día, tráfico invisible para Google Analytics pero catastrófico tras bambalinas. Lo que inicialmente creí que eran usuarios genuinos eran, en realidad, parte de una ola implacable de visitas automatizadas, inundando mi infraestructura y amenazando la viabilidad de todo mi proyecto.
Esta no es solo una historia sobre actores malintencionados explotando debilidades, es sobre cómo la misma arquitectura de la web moderna está bajo asedio. Las optimizaciones de código y las actualizaciones del servidor no fueron suficientes. El desafío se convirtió en una carrera armamentista, con mi sitio atrapado en el fuego cruzado. Aquí está cómo se desarrolló la inundación de bots, casi destruyendo todo lo que había construido, y los pasos que tomé para luchar.
Mi historia de tráfico de bots: de 3 millones de visitas a medio millón
Todo comenzó con una agencia de publicidad que me acusó de tener un 90% de tráfico falso, ya lo he dicho antes: habían colocado un código de seguimiento en mi sitio para entregar anuncios, y el volumen de bots también era un problema para ellos, saturaba sus filtros e inflaba la carga del servidor. Estamos hablando de más de un millón de visitas de bots por día.
Al principio, estaba indignado. En Google Analytics, veía 100,000 visitas puras diarias. Usuarios reales, pensaba yo. Pero su preocupación era el tráfico fuera de Analytics. Esa capa invisible de visitas estaba causando estragos en la carga del servidor. En ese entonces, mi proyecto se ejecutaba en Laravel 5.3 alojado en un hosting compartido, y creía que el cuello de botella del rendimiento era la antigua base de código. Reescribí todo en Laravel 10 con una optimización excelente, incluyendo análisis diarios de millones de registros de base de datos.
Aún así, seguía lento. Mi hosting compartido no podía manejarlo. Las cargas de página eran lentas y el tráfico real disminuía; mes a mes perdía alrededor de 150,000 visitas. De 3 millones de visitas mensuales, eventualmente perdí más de la mitad.
Había actualizado a un VPS potente con 16 núcleos de CPU y 32 GB de RAM, esperando que esto resolviera todo. Pero incluso con la infraestructura mejorada y el backend recodificado en Laravel 10, el problema persistía. De hecho, las cosas empeoraron: los bots se volvieron más agresivos, aumentando su volumen y frecuencia de ataque. Quedó claro que ninguna cantidad de optimización de código o escalado de hardware podría solucionar un problema que era fundamentalmente sobre tráfico de bots descontrolado y malicioso.
Pero eso no era todo. Profundizando más, me di cuenta de que la escala era aún mayor: más de 2 millones de rastreos del sitio por día, aparte de aproximadamente 1.5 millones de visitas diarias de bots. Y sin embargo, la parte monetizable y rastreable del sitio (la que importaba a las agencias) solo estaba generando 100,000 impresiones al día. Ahí es donde el problema se intensificó. Estaba trabajando con una agencia de publicidad que dependía de tráfico limpio y humano. Tenían que encontrar formas de filtrar rápidamente los bots, o sus sistemas de análisis y entrega de anuncios se verían abrumados. Las acusaciones, la sobrecarga de infraestructura y las discrepancias de ingresos, todo estaba relacionado con esta inundación invisible y constante de bots.
Mi primer movimiento fue crear un CAPTCHA personalizado, con el objetivo de mostrar una página en blanco a los bots mientras los usuarios reales pasaban. Desafortunadamente, eso salió mal. Los bots maliciosos no disminuyeron, aumentaron. El CAPTCHA se convirtió en un desafío que intentaron superar agresivamente, duplicando la carga.
Luego vino el bloqueo masivo a través de .htaccess. Funcionó, durante unos días. Luego las redes de bots se ajustaron, aparecieron nuevas IPs y .htaccess se volvió lento y sobrecargado. Mi proveedor de hosting intervino, ayudando a bloquear subredes enteras temporalmente, pero el problema regresaba semanalmente.
Finalmente, recurrí a Cloudflare. Este fue el cambio más impactante. Aunque no perfecto, me permitió filtrar más de 1.5 millones de solicitudes de bots en 24 horas. Subí bloques de red directamente a su firewall. ¿El resultado? De 1.5 millones de visitas de bots, solo se desencadenaron 20 desafíos CAPTCHA diarios, prueba de que la detección de borde de Cloudflare funcionó mejor que cualquier otra cosa que probé.
Para mantenerme por delante de los bots, construí mi propio sistema de registro interno. Registra cada solicitud por dirección IP y cadena del Agente de Usuario, almacenándolos en una base de datos. Detrás de escena, una tarea programada se ejecuta cada minuto para agregar los datos. Cuando detecta actividad sospechosa, como un gran volumen de solicitudes provenientes de una sola red o rango de IP, dispara una notificación por correo electrónico automatizada. Ese correo incluye una lista de IPs y subredes listas para ser agregadas a Cloudflare para su bloqueo.
Todavía estoy en el plan gratuito de Cloudflare, pero incluso eso proporciona suficiente control para implementar reglas de firewall manuales. Este enfoque proactivo me permite detectar y responder a inundaciones de bots antes de que abrumen el sistema. A nivel de Apache, originalmente intenté usar .htaccess para bloquear el tráfico directamente, pero este método tuvo rendimientos decrecientes. A medida que se acumulaban más reglas, el rendimiento del sitio se degradaba, dejando claro que el bloqueo a nivel de servidor no era sostenible sin un CDN o soporte de capa de borde.
¿Cómo crear un sistema de inicio de sesión + protección CloudFlare?
¿Por qué no limitación de tasa o bloqueo geográfico? Porque no funcionan en mi caso. La mayoría de estos bots hacen solo una solicitud por IP, pero lo hacen utilizando cientos o incluso miles de IPs dentro de la misma red. Eso significa que la limitación de tasa por IP no ayuda mucho; el volumen está distribuido, no concentrado. ¿En cuanto a detectarlos por User-Agent? Inútil. Algunos bots son lo suficientemente inteligentes como para imitar a Googlebot u otros rastreadores legítimos, por lo que no puedes confiar solo en los encabezados. ¿Qué pasa con el filtrado por geolocalización? Tampoco es efectivo. Mi sitio es multilingüe y recibe tráfico de muchos países por diseño. Estas redes de inundación lo saben y rotan IPs de todo el mundo. Tal vez me estén rastreando porque mi sitio tiene contenido valioso, pero no puedo simplemente bloquearlo detrás de una pared de registro. Eso arruinaría la experiencia del usuario. Así que necesitaba algo más inteligente que las soluciones usuales.
Mira mi código, consultas MYSQL y recomendaciones a continuación. (Laravel 10 + MYSQL)