Estoy tratando de proteger mis aplicaciones de algunos bots que funcionan mal o intentan eliminar mis sitios (muchas solicitudes de las mismas IP en los registros).
Cada vez que alguien solicita una acción costosa o relacionada con la seguridad, guardo el nombre de esa acción, la IP y la fecha. Luego verifico algunos límites, por ejemplo: la acción login.fail tiene un límite de 10 intentos cada 10 minutos y 20 por hora. Si se supera el límite, guardo la prohibición y no permito más acciones desde esa IP (simplifiqué un poco la descripción).
Esto funciona bien, pero esto podría dejar fuera a los usuarios legítimos. Por ejemplo, si muchos usuarios provienen de la misma VPN y comparten la misma IP (incluso si los bots no provienen de esa IP). Y no quiero crear sitios que obstaculicen la privacidad (al prohibir las VPN) solo para estar a salvo de los robots.
No puedo comprobar si hay encabezados como el User-Agent porque se pueden falsificar.
Entonces, ¿qué puedo hacer? ¿Hay alguna forma de evitar esto? ¿Algo más que pueda verificar que no sea el IP?