Pregunta

¿Cuál es la mejor manera de detener a los robots, los usuarios maliciosos, etc.la ejecución de scripts php demasiado rápido?Está bien si yo uso el usleep() o sleep() funciones a hacer simplemente "nada" por un tiempo (justo antes de que el código deseado ejecuta), o que es una estupidez y que hay mejores maneras para esto?

Ejemplo:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

Si acabo de poner, decir, usleep(3000000) antes de que el inicio de sesión y cierre de sesión de los códigos, es esto correcto, o hay una mejor, más sabia de las maneras de lograr lo que quiero lograr?

editar: Basado en las sugerencias a continuación, ¿ entonces usleep o sleep sólo hará que el procesador de desenganchar el actual script que está siendo ejecutado por el usuario actual, o provocar que se desprenda de todo el servicio?es decir,Si un usuario+script invoca un sleep/usleep, todos los usuarios concurrentes+secuencias de comandos se retrase demasiado?

¿Fue útil?

Solución

La forma en que la mayoría de los servidores web de trabajo (Apache por ejemplo) es mantener una colección de subprocesos de trabajo.Cuando un script de PHP se ejecuta, un subproceso se ejecuta el script de PHP.

Cuando su script no sleep(100), la secuencia de comandos tiene 100 segundos para ejecutar..Eso significa que el hilo está atado durante 100 segundos.

El problema es, usted tiene un número finito de subprocesos de trabajo - dicen que usted tiene 10 hilos, y 10 personas de inicio de sesión - ahora su servidor web puede servir a cualquier otra de las respuestas..

La mejor manera de velocidad-límite de conexiones (o de otras acciones) es el uso de algún tipo de ayuno en memoria de almacenamiento cosa (memcached es perfecto para esto), pero que requiere la ejecución de proceso independiente y es bastante complicado (usted puede hacer esto si usted ejecutar algo como Facebook..).

Más simple, usted podría tener una tabla de base de datos que almacena user_id o ip_address, first_failed y failure_counter.

Cada vez que usted obtiene un error de inicio de sesión, usted (en pseudo-código) que hacer:

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

Tal vez no el más eficiente, y que hay mejores formas, pero debe parar fuerza bruta bastante bien.El uso de memcached es básicamente el mismo, pero la base de datos se sustituye con memcached (que es más rápido)

Otros consejos

  

para detener bots, usuarios maliciosos, etc.   por ejecutar scripts php demasiado rápido?

Primero preguntaría qué es lo que realmente está tratando de prevenir. Si se trata de ataques de denegación de servicio, tendría que decir que no hay nada que pueda hacer si está limitado por lo que puede agregar a los scripts PHP. El estado del arte está mucho más allá de lo que nosotros, como programadores, podemos proteger. Comience a buscar herramientas de administrador de sistemas diseñadas para este propósito.

¿O estás tratando de limitar tu servicio para que personas reales puedan acceder a él pero los bots no puedan? Si es así, miraría algunos & "; Captcha &"; técnicas.

¿O está tratando de evitar que los usuarios consulten su sitio cada segundo buscando contenido nuevo? Si es así, investigaría si proporciona una fuente RSS o alguna otra forma de notificarlos para que no consuman su ancho de banda.

¿O es algo más?

En general, yo diría que ni sleep () ni usleep () es una buena manera.

Su método sugerido obligará a TODOS los usuarios a esperar innecesariamente antes de iniciar sesión.

La mayoría de los servidores LAMP (y la mayoría de los enrutadores / conmutadores, en realidad) ya están configurados para evitar ataques de denegación de servicio. Lo hacen al negar múltiples solicitudes consecutivas de la misma dirección IP.

No quieres dormir en tu php. Si lo hace, reducirá en gran medida la cantidad de solicitudes simultáneas que su servicio puede manejar, ya que tendrá las conexiones abiertas esperando.

La mayoría de los servidores HTTP tienen características que puede habilitar para evitar ataques DoS, pero si falla, debe rastrear las direcciones IP que ha visto demasiadas veces y enviarles un 403 Prohibido con un mensaje pidiéndoles que esperen un segundo.

Si por alguna razón no puede contar con que REMOTE_ADDR sea específico del usuario (todos los que están detrás del mismo firewall, etc.) podría probar un desafío en el formulario de inicio de sesión y hacer que el navegador remoto realice un cálculo extendido (digamos, factor un número) que puede verificar rápidamente en el lado del servidor (con multiplicación rápida).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top