Esta funcionalidad permite controlar el número de peticiones que se realizan a tu sitio web. La restricción puede basarse en la IP del cliente (True-Client-IP), una cookie, una URL o cualquier otro criterio que tenga sentido para tu aplicación.
La función se invoca mediante la llamada rate_limit y requiere que se definan previamente dos headers: TCDN-WAF-Set-RateLimit-Key y TCDN-WAF-Set-RateLimit-Options.
TCDN-WAF-Set-RateLimit-Key es opcional e identifica el criterio sobre el que se aplica la regla. Si no se especifica, se utiliza True-Client-IP por defecto.
TCDN-WAF-Set-RateLimit-Options es obligatorio y tiene la siguiente sintaxis:
<limit>:<period>[:<block>][:captcha|:js_challenge]
<limit>: Número máximo de peticiones permitidas dentro del periodo definido.<period>: Ventana de tiempo en la que se aplica el límite.<block> (opcional): Duración del bloqueo una vez superado el límite.captcha o js_challenge (opcional): Muestra un CAPTCHA o un desafío JavaScript cuando se alcanza el límite.Si se incluye el parámetro captcha y se supera el límite, el usuario deberá validarlo para continuar navegando. Esta validación tiene una validez de cinco minutos. Si dentro de ese periodo el usuario vuelve a superar el límite, se aplicará el tiempo de bloqueo definido (si se ha especificado). Una vez expirada la validación, si el usuario vuelve a superar el umbral, se le mostrará un nuevo CAPTCHA.
Si quisieras limitar cada usuario a un máximo de 20 peticiones por segundo en www.my-site.com, discriminando por IP, y bloquear al usuario durante 30 segundos mostrándole un CAPTCHA al superar ese límite, la configuración VCL a desplegar desde el dashboard sería:
# rate limit with captcha
sub vcl_recv {
if (req.http.host == "www.my-site.com") {
set req.http.TCDN-WAF-Set-RateLimit-Key = req.http.True-Client-IP;
set req.http.TCDN-WAF-Set-RateLimit-Options = "20:1s:30s:captcha";
call rate_limit;
}
}
Una vez alcanzado el límite, las peticiones del usuario afectado recibirán un código de estado 429 (Too Many Requests) o 418 (Robots are not allowed here!) si la validación del CAPTCHA fue incorrecta.
Si prefieres utilizar un desafío JavaScript en lugar de un CAPTCHA, la primera vez que un usuario supere el límite su navegador recibirá un desafío no interactivo que permite distinguir entre humanos y bots:
# rate limit with javascript challenge
sub vcl_recv {
if (req.http.host == "www.my-site.com") {
set req.http.TCDN-WAF-Set-RateLimit-Key = req.http.True-Client-IP;
set req.http.TCDN-WAF-Set-RateLimit-Options = "20:1s:30s:js_challenge";
call rate_limit;
}
}
Los límites no tienen por qué aplicarse únicamente por IP. Por ejemplo, se puede definir una cuota de 30 peticiones por minuto por API key:
# rate limit
sub vcl_recv {
if (req.http.host == "www.my-site.com") {
set req.http.TCDN-WAF-Set-RateLimit-Key = "API key=" + req.http.API-Key;
set req.http.TCDN-WAF-Set-RateLimit-Options = "30:60s";
call rate_limit;
}
}
También es posible restringir únicamente ciertos tipos de peticiones. Por ejemplo, para limitar las peticiones POST y PUT a un máximo de 2 cada 10 segundos por usuario:
# rate limit
sub vcl_recv {
if (req.http.host == "www.my-site.com") {
if (req.method == "POST" || req.method == "PUT") {
set req.http.TCDN-WAF-Set-RateLimit-Key = req.http.True-Client-IP;
set req.http.TCDN-WAF-Set-RateLimit-Options = "2:10s";
call rate_limit;
}
}
}
Estos son solo algunos ejemplos representativos. Los límites pueden aplicarse a todo el sitio o a rutas concretas, y el criterio de discriminación puede adaptarse a las necesidades de cada aplicación.