Voglio limitare la frequenza di upload del file al nostro servizio web per prevenire il denial-of-service (diretto al server) - in particolare, cartelle temporanee che si riempiono di caricamenti fasulli.
Questo potrebbe essere il comportamento scorretto dell'utente, o, se questo va su http :, qualcuno che finge di essere l'utente.
Ci sono già alcune misure, come limitare le dimensioni del file, controllare l'agente utente, ma voglio aggiungere una sorta di limitazione della velocità.
- Un utente può caricare 3 file "contemporaneamente".
- Supponiamo che l'azione dell'utente legittima richieda almeno 5 secondi (tra caricamenti validi).
- Gli utenti sono identificati da UserID, hanno già effettuato l'accesso
L'idea corrente è di mantenere un elenco / array con i tre tempi di caricamento (tentativo) più recenti per ID utente e scartare il caricamento se la differenza tra il tempo di caricamento (ora di fine della transazione) e la più vecchia delle tre volte è meno di 5 secondi.
Esempio: un utente carica file a 1,3,7,15,20,21,22,23,24,36 secondi:
Time Array
[0,0,0] Initial situation
1 [0,0,0] Comparing with first entry 0 - allowed
3 [0,0,1] Idem
7 [0,1,3] Idem
14 [1,3,7] 14-1 > 5 Allowed
20 [3,7,15] 20-3 > 5 Allowed
21 [7,15,20] 21-7 > 5 Allowed
22 [15,20,21] 22-15 > 5 Allowed
23 [20,21,22] 23-20 < 5 Upload discarded
24 [21,22,23] 24-21 < 5 Upload discarded
36 [22,23,24] 36-24 > 5 Allowed
Per me la domanda è se questo è un algoritmo abbastanza decente per valutare limitare i caricamenti. Ma in particolare:
Quando / dove fallirà? Dove vedi scappatoie?
Note:
- Gestisco già un token thread-safe per ogni utente, quindi ciò significherebbe solo aggiungere 3 DWORD (per i conteggi delle tacche)
- Con lo spoofing di un utente, un utente malintenzionato negherebbe i caricamenti per quell'utente, ma non è quello che voglio proteggere contro
- Non abbiamo disposizioni per gestire gli attacchi di riproduzione; questa è una discussione diversa che non voglio mescolare con questa
- FWIW sto programmando in Delphi XE2