Aprende a proteger tu servidor PHP de abusos, bots o ataques de fuerza bruta limitando el número de peticiones por segundo de cada IP.

Qué es el Rate Limiting y por qué es importante
El Rate Limiting (o limitación de tasa) es una técnica que permite restringir el número de peticiones que un usuario (o IP) puede hacer a un servidor en un periodo de tiempo determinado.
Se utiliza para:
- Evitar abusos de APIs o formularios.
- Proteger tu servidor de ataques DDoS.
- Reducir el uso excesivo de recursos.
- Controlar el tráfico automatizado.
En este tutorial vas a aprender cómo crear tu propio sistema de rate limit en PHP usando archivos temporales para almacenar las peticiones.
Código PHP completo (copiar y pegar)
<?php
// ===========================================
// SISTEMA DE RATE LIMIT EN PHP
// ===========================================
// Obtenemos la IP real del usuario
// Si usas Nginx Proxy, 'HTTP_X_REAL_IP' devuelve la IP original
$ip = $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'];
// Configuramos el límite de peticiones
$maxRequests = 3; // Máximo de peticiones permitidas
$window = 5; // Ventana de tiempo en segundos
$now = microtime(true); // Momento actual con microsegundos
// Definimos la ruta del archivo temporal donde se almacenarán las peticiones
$rateLimitFile = sys_get_temp_dir() . '/rate_limit_' . md5($ip) . '.txt';
// Cargamos las peticiones anteriores (si existen)
$requests = [];
if (file_exists($rateLimitFile)) {
$requests = json_decode(file_get_contents($rateLimitFile), true);
if (!is_array($requests)) $requests = [];
// Eliminamos peticiones fuera de la ventana de tiempo
$requests = array_filter($requests, function($t) use ($now, $window) {
return ($now - $t) < $window;
});
}
// Añadimos la nueva petición actual
$requests[] = $now;
// Si el número de peticiones excede el máximo, devolvemos error 429
if (count($requests) > $maxRequests) {
http_response_code(429);
header('Content-Type: application/json');
echo json_encode([
'error' => '🚫 Demasiadas peticiones desde esta IP. Intenta más tarde.',
'ip' => $ip,
'limit' => $maxRequests,
'window_seconds' => $window
]);
exit;
}
// Guardamos el registro actualizado de peticiones
file_put_contents($rateLimitFile, json_encode($requests));
// Si no se ha superado el límite, continuamos normalmente
header('Content-Type: application/json');
echo json_encode([
'status' => 'OK',
'message' => 'Petición aceptada correctamente.',
'ip' => $ip,
'peticiones_en_ventana' => count($requests)
]);
Descripción:
Identifica al usuario por IP.
Cada visitante se identifica con su dirección IP.
Crea un archivo temporal único por cada IP donde se guardan los timestamps de las últimas peticiones.
Cada vez que se hace una petición, se guardan las marcas de tiempo recientes y se eliminan las antiguas.
Si hay más de 3 peticiones en 5 segundos, el script devuelve el código HTTP 429 Too Many Requests y corta la ejecución.
Si no se supera el límite, la respuesta sigue su curso normal.
Puedes usar este script al inicio de tus endpoints o APIs en PHP, por ejemplo:
require 'rate_limit.php'; // incluir el script // Tu lógica principal aquí echo "Hola, mundo seguro";
Cada vez que un mismo usuario haga más de 3 peticiones en menos de 5 segundos, el servidor responderá con un mensaje de error en formato JSON.
Consejos y mejoras opcionales
- Cambia
$windowy$maxRequestssegún tus necesidades (por ejemplo, 10 peticiones por minuto). - Guarda los datos en Redis o Memcached si esperas mucho tráfico.
- Puedes agregar una whitelist (lista blanca) de IPs seguras.
- Añade logs o métricas para ver cuántas IPs están siendo limitadas.

Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.