Oggi voglio mettere a disposizione di tutti uno script PHP (Hypertext Preprocessor) che permette a qualsiasi utente di essere rallentato se i limiti impostati per caricare una pagina web sono raggiunti. Se stai cercando qualcosa per fermare gli attacchi DDOS non sei nel posto giusto; se stai cercando qualcosa per inibire l'accesso alle pagine web in base al numero massimo di richieste in un tempo limitato questo piccolo script PHP può aiutarti. Se limitare l'accesso a un'API (Application Programming Interface) o limitare l'accesso a aree sensibili (come non permettere l'aggiornamento continuo della pagina in aree critiche come la registrazione o l'autenticazione) si è nel posto giusto per imparare a farlo in modo professionale, veloce ed efficiente. Per fare questo in modo ad alte prestazioni abbiamo bisogno di un database “no-sql” e proprio per questo script usiamo un database ancora più performante con tecnologia “in-memory”, cioè un database che scrive a memoria volatile. Quando pubblico uno script mi piace farlo in modo libero, senza particolari dipendenze, senza bloccarlo in funzioni o classi se non è necessario; tuttavia, è ancora possibile creare una funzione o addirittura incapsularlo in una classe, come si desidera.

Questo è lo script [Licenza Apache-2.0]
<
#
* sommario breve tasso.
#
* @version 1.0
* @author oskar @ myincorporate.org
#
* $time_period = periodo di tempo è specificato in secondi (3600 secondi è 1 ora , 86400 secondi è 1 giorno)
* $max_calls_limit = telefonate max consentite in quel periodo
* $total_user_calls = il toal chiama l'utente ha fatto
* intestazioni dei clienti:
* X-RateLimit-Limit: È per fornire capacità massima.
* X-RateLimit-Remaining: È per clarificare i limiti di rimaning (tokens).
* X-RateLimit-Reset: Il tempo in cui il limite di tasso si resetta, specificato in tempo di epoca UTC (in secondi)
*
$redis = nuovo Redis();
//connessione al database di memoria redis
$redis->connect('127.0.0.1', 6379);
//password per redi
$redis->auth(');
//selezionare il database in memoria (può essere cambiato da 0 a max 16)
$redis->select(0);
// È possibile modificare questa parte per impostare valori personalizzati
$max_calls_limit = 500;
$time_period = 3600;
$total_user_calls = 0;
//fine della parte modificabile
//È possibile modificare questa parte per implementare il sistema di autenticazione, basta modificare la variabile $user_code_ratelimit con il token utilizzato dal sistema di autenticazione.
//Get IP del visitatore (anche dietro proxy)
se (in inglese) SERVER["HTTP_CF_CONNECTING_IP"]):
['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
endif;
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER['REMOTE_ADDR'];
se (filter_var($client, FILTER_VALIDATE_IP)):
$user_code_ratelimit = $client;
Se (filter_var($forward, FILTER_VALIDATE_IP)):
$user_code_ratelimit = $forward;
Altro:
$user_code_ratelimit = $remote;
endif;
//fine della parte modificabile
//hash il codice utente creato
$user_code_ratelimit_hashed = hash('sha256', $user_code_ratelimit);
//controllare il database in memoria e aggiornarlo se necessario
se (!$redis->exists($user_code_ratelimit_hashed)):
$redis->set($user_code_ratelimit_hashed, 1);
$redis->expire($user_code_ratelimit_hashed, $time_period);
$total_user_calls = 1;
Altro:
$redis->INCR($user_code_ratelimit_hashed);
$total_user_calls = $redis->get($user_code_ratelimit_hashed);
se ($total_user_calls > $max_calls_limit):
Echo "Il limite di tasso è superato. Si prega di riprovare più tardi.";
uscita();
endif;
endif;
//settings header per il cliente (importante: mettere questo prima di qualsiasi uscita, se questo non è possibile commentare queste 3 linee)
header('X-RateLimit-Limit: '.$max_calls_limit);
header('X-RateLimit-Remaining: '.$max_calls_limit-$total_user_calls);
header('X-RateLimit-Reset: '.$time_period);
>È possibile visualizzare lo script direttamente sul mio Github qui: https://github.com/OskarCosimo/rate-limit/
Come funziona lo script?
Questo script contiene commenti utili che possono essere utilizzati per modificare le variabili come desiderato. La connessione al database avviene facilmente in un unico passaggio, tramite la chiamata $redis->connect(‘127.0.0.1’, 6379) dove 127.0.0.1 è l'indirizzo interno del server (localhost) e 6379 è la porta utilizzata dal database (è quella predefinita); la variabile $redis->auth(‘ ‘) è la password del database (impostata durante la fase di installazione) mentre la variabile $redis->select(0) è il numero del database da utilizzare (Redis può avere un massimo di 16 database diversi , questo è utile se si desidera creare più script che leggono da diversi database). The $time_period variabile e $max_calls_limit variabili sono le uniche due variabili che dovrebbero essere modificate (oltre a quelle relative alla connessione del database) e consistono nel specificare il periodo di tempo (espresso in secondi) e il numero massimo di richieste (int senza decimali) che è possibile fare. La variabile $user_code_ratelimit è quello che si prende cura di avere un identificatore dell'utente che ha fatto la richiesta al server, per impostazione predefinita prendiamo l'indirizzo IP del visitatore ma questa variabile può anche essere impostata con il codice utente salvato su un database che si riferisce all'autenticazione dell'utente; questo script, quindi, può anche essere integrato con qualsiasi sistema di autenticazione e con una piccola modifica è anche possibile aumentare il numero di richieste per gli utenti già registrati.
Che cosa è Redis
Redis è un data store open source in-memory che può essere utilizzato come database, cache o broker di messaggi. È spesso utilizzato per il caching pagine web e ridurre il carico sui server. Redis ha anche alcune caratteristiche che lo rendono attraente per l'uso come database, come il supporto per le transazioni e pubblicare / sottoscrivere la messaggistica.
Come installare Redis sul server
La guida ufficiale per installare Redis in ogni sistema operativo è qui: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis
Questo sistema è usato su MYETV?
Sì, questo sistema viene utilizzato e sarà utilizzato più frequentemente per proteggere contro i numerosi MYETV accessi; per aumentare il numero di richieste disponibili sarà necessario registrarsi sulla piattaforma.

