Hoy quiero poner a disposición de todos un script PHP (Hypertext Preprocessor) que permite que cualquier usuario se ralentice si se alcanzan los límites establecidos para cargar una página web. Si usted está buscando algo para detener los ataques DDOS no está en el lugar correcto; si usted está buscando algo para inhibir el acceso a las páginas web basado en el número máximo de solicitudes en un tiempo limitado este pequeño script PHP puede ayudarle. Ya sea para limitar el acceso a una API (Interfaz de programación de aplicaciones) o limitar el acceso a áreas sensibles (como no permitir la actualización continua de la página en áreas críticas como registro o autenticación) usted está en el lugar adecuado para aprender a hacerlo de manera profesional, rápida y eficiente. Para hacer esto de una manera de alto rendimiento necesitamos una base de datos “no sql” y precisamente para este script utilizamos una base de datos de alto rendimiento con tecnología “en memoria”, es decir, una base de datos que escribe a la memoria volátil. Cuando publico un guión me gusta hacerlo de forma gratuita, sin dependencias particulares, sin encerrarlo en funciones o clases si no es necesario; sin embargo, es posible crear una función o incluso encapsularla en una clase, como usted desee.

Este es el guión [Licencia Apache-2.0]:
Identificado?php
*
* resumen corto de límite de tarifas.
*
* @version 1.0
* @author oskar @ myincorporate.org
*
* $time_perod = El tiempo se especifica en segundos (3600 segundos es 1 hora, 86400 segundos es 1 día)
* $max_calls_limit = max calls allowed in that timespan
* $total_user_calls = las llamadas toallas que el usuario ha hecho
* clientes encabezados:
* X-RateLimit-Limit: Es para proporcionar la máxima capacidad.
* X-RateLimit-Remanente: Es para clarificar los límites de remaning (tokens).
* X-RateLimit-Reset: El tiempo en que el límite de velocidad se reinicia, especificado en el tiempo de época UTC (en segundos)
*/
$redis = nuevo Redis();
//conexión a la base de datos de memoria redis
('127.0.0.1', 6379);
//password para redis
$redis-jóauth('');
//Seleccionar la base de datos en memoria (puede cambiarse de 0 a max 16)
(0);
//Puede editar esta parte para establecer valores personalizados
$max_calls_limit = 500;
$time_perod = 3600;
Total_user_calls = 0;
//End de la parte editable
//Es posible editar esta parte para implementar el sistema de autenticación, simplemente cambiar la variable $user_code_ratelimit con el token utilizado por el sistema de autenticación.
// Obtener la IP del visitante (también si detrás del proxy)
(isset($_) SERVER["HTTP_CF_CONNECTING_IP"]):
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP];
$_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
endif;
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER['REMOTE_ADDR'];
si (filter_var($client, FILTER_VALIDATE_IP)):
$user_code_ratelimit = $client;
(filter_var($forward, FILTER_VALIDATE_IP)):
$user_code_ratelimit = $forward;
más:
$user_code_ratelimit = $remote;
endif;
//End de la parte editable
//hash el código de usuario creado
$user_code_ratelimit_hashed = hash('sha256', $user_code_ratelimit);
// verifique la base de datos en memoria y actualice si es necesario
si (!$redis-proveexists($user_code_ratelimit_hashed)):
($user_code_ratelimit_hashed, 1);
$redis- confíaexpire($user_code_ratelimit_hashed, $time_period);
$total_user_calls = 1;
más:
$redis- confíaINCR($user_code_ratelimit_hashed);
$total_user_calls = $redis- título($user_code_ratelimit_hashed);
si ($total_user_calls ó $max_calls_limit):
eco "El límite de tarifas se supera. Inténtelo de nuevo más tarde.
(salida));
endif;
endif;
//ajustes encabezado para el cliente (importante: poner esto antes de cualquier salida, si esto no es posible comentar estas 3 líneas)
header('X-RateLimit-Limit: '.$max_calls_limit);
header('X-RateLimit-Remaining: '.$max_calls_limit-$total_user_calls);
header('X-RateLimit-Reset: '.$time_perod);
?Puede ver el guión directamente en mi Github aquí: https://github.com/OskarCosimo/rate-limit/
¿Cómo funciona el guión?
Este script contiene comentarios útiles que se pueden utilizar para modificar variables como se desee. La conexión a la base de datos se produce fácilmente en un solo paso, a través de la llamada $redis-conexión(‘127.0.0.1’, 6379) donde 127.0.0.1 es la dirección interna del servidor (localhost) y 6379 es el puerto utilizado desde la base de datos (es el predeterminado); la variable $redis-jóauth(‘ ‘) es la contraseña de la base de datos (establecida durante la fase de instalación) mientras que la variable $redis- tituladoselect(0) es el número de la base de datos a utilizar (Redis puede tener un máximo de 16 bases de datos diferentes, esto es útil si desea crear múltiples scripts que lean desde diferentes bases de datos). El $time_período variable y el $max_calls_limit variable son las únicas dos variables que deben ser modificadas (además de las relacionadas con la conexión de la base de datos) y consisten en especificar el período de tiempo (expresado en segundos) y el número máximo de solicitudes (sin decimales) que es posible hacer. La variable $user_code_ratelimit es el que se ocupa de tener un identificador del usuario que hizo la solicitud al servidor, por defecto tomamos la dirección IP del visitante, pero esta variable también se puede configurar con el código de usuario guardado en una base de datos que se refiere a la autenticación del usuario; este script, por lo tanto, también se puede integrar con cualquier sistema de autenticación y con una pequeña modificación también es posible aumentar el número de solicitudes permitidas para usuarios ya registrados.
Qué es Redis
Redis es una tienda de datos de código abierto que se puede utilizar como base de datos, caché o corredor de mensajes. A menudo se utiliza para caché páginas web y reducir la carga en servidores. Redis también tiene algunas características que lo hacen atractivo para su uso como base de datos, como el apoyo a las transacciones y la publicación o suscripción de mensajes.
Cómo instalar Redis en su servidor
La guía oficial para instalar Redis en cada sistema operativo está aquí: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis
¿Este sistema se utiliza en MYETV?
Sí, este sistema se utiliza y se utilizará con más frecuencia para proteger contra los numerosos MYETV accesos; para aumentar el número de solicitudes disponibles será necesario registrarse en la plataforma.

