2009-09-10 14 views
12

Ciao a tutti, gestisco un sito Web di hosting di immagini e sto progettando un'API per questo. La mia preoccupazione è che io non voglio che nessuno sia in grado di fare qualcosa di simile:Come proteggere una API dall'abuso?

while(true) { 
    Upload(); 
} 

e spam/DoS al sito.

La mia soluzione attuale è limitare tutti gli indirizzi IP a un certo numero di caricamenti al giorno/ora. Credo che funzionerà bene per le applicazioni desktop che utilizzeranno l'API, ma per i siti Web che desiderano utilizzarlo, tutti gli utenti avranno lo stesso IP (quello del server).

Suppongo che la soluzione migliore sarebbe disporre di account utente che si autenticano con l'API e quindi vietare ogni account in caso di abuso. Il problema è che il mio sito non ha alcun account utente, è completamente anonimo.

Che altro si può fare? Vorrei mantenere le cose il più possibile aperte, mentre allo stesso tempo ho la possibilità di vietare gli utenti/IP che stanno ovviamente abusando del servizio.

+0

Forse i tuoi siti di collaborazione di terze parti possono decorare la richiesta con l'IP originale, come l'intestazione HTTP X_FORWARDED_FOR? –

+0

Forse le funzionalità anti-DoS sono integrate nel web server (configurabile in) e quindi non devono essere presenti nell'applicazione web? – ChrisW

+0

ChrisW: No, il DoS può verificarsi su più livelli di un'app; diciamo bloccando tutti gli account utente, ecc. Devono essere soddisfatti a questo livello. –

risposta

9

Se non si desidera implementare account utente, che ne dite di avere coloro che desiderano utilizzare l'API per la firma di una chiave/segreto API, che è possibile utilizzare per valutare il limite con.

+1

+1 per le chiavi API. – LiraNuna

+0

LiraNuna: ti suggerisco di guardare anche in OAuth. È una specifica per trattare tutto questo (chiavi API e così via) correttamente. –

+0

OAuth è un modo per implementare le chiavi API. Dal momento che l'OP non ha chiesto un servizio per farlo per lui, ma un'idea di come gestirlo, credo che questa sia una risposta migliore. – LiraNuna

2

In una società per cui ho lavorato, abbiamo implementato la limitazione per tutti i clienti non paganti, con un limite di un certo numero di richieste al giorno, teoricamente configurabile per endpoint API. Se è necessario fornire un ID univoco come chiave dell'applicazione in ogni richiesta, nel QueryString per le API leggere o nel XML di richiesta POST per API più complesse. Per gli utenti finali che non utilizzano un'API pubblica, è possibile invece passare un token di autenticazione.

Se si fornisce un'API pubblica senza richiedere alcun tipo di autenticazione o autorizzazione, sarà necessario ricorrere alla limitazione basata su indirizzo IP. Ma non è difficile creare una pagina web di fornitura leggera che consenta alle persone di registrarsi per l'accesso alle API.

La logica dell'applicazione può essere regolata in base al numero di richieste, come abbiamo fatto noi, o alla larghezza di banda giornaliera, come fa Flickr.

0

Richiede un token per caricare e limita il token con un CAPTCHA. Il codice di consumo sarebbe qualcosa di simile:

// 1st request 
var uploadToken = api.RequestToken(sessionIdFromUser); 
if (uploadToken.RequireChallenge) { 
    // requires challenge due to per IP limiting 
    // uploadToken.Captcha could be a URL 
    DisplayView(uploadToken.Captcha, uploadToken.SessionId); 
    return; 
} 
api.Upload(uploadToken, captchaFromUser, byte[]); 
1

Come altri hanno menzionato su questo thread, le chiavi API sono spesso la strada da percorrere in tali situazioni. Il fatto che il tuo sito non contenga account utente non importa: una chiave API identifica un'applicazione , e non un utente. (In effetti, se il tuo sito aveva utenti, hai bisogno di meccanismi separati per identificare l'app e l'utente in una chiamata API: è qui che OAuth è molto utile).

Se non si desidera creare il proprio processo di registrazione degli sviluppatori, processo di emissione delle chiavi API, codice di limitazione, ecc., Incoraggerei l'utente a dare un'occhiata alla mia azienda, WebServius (www.webservius.com), che fornisce un livello di gestione dell'API ospitato su un'API che fornisci.

3

Controlla uno strumento di gestione API open source come apiGrove; apiGrove.net o su GitHub a apigrove.github.com/apigrove. apiGrove supporta una varietà di approcci alla protezione dell'API, tra cui whitelist IP e autorizzazione per chiave.

Problemi correlati