Come proteggere l'API REST dalla scansione durante la pubblicazione di contenuti pubblici?

5

Ho un'app Web ReactJs, un'app Android che utilizza sia un'API REST creata con django, l'intero progetto è per media / notizie, la parte più grande dell'API REST è il contenuto pubblico, c'è una piccola parte in cui l'utente ha protetto gli endpoint API con l'autenticazione basata su token.

Il problema che stiamo affrontando è che ci sono più persone che eseguono la scansione della nostra API REST e duplicano i nostri contenuti in molti luoghi e non possiamo tenere traccia di quelli e fermarli, quindi stiamo pensando ad un modo in cui possiamo fare REST API HARDER da sottoporre a scansione.

La mia attuale soluzione suggerita: Crittografia ma la mia attuale comprensione della crittografia è che crittografa le risposte API REST dal server e nel client in javascript lo decifri, ma hai ancora bisogno di un chiave di decodifica o token, quindi dovrai affrontare altri problemi di salvataggio di quel token sul lato client.

Esiste un metodo migliore per proteggere l'API rispetto alla crittografia?

Quali sono le migliori pratiche per salvare il token nel lato client?

Grazie.

    
posta Iliyass Hamza 24.05.2017 - 23:01
fonte

2 risposte

3

Ero abituato a scrivere web scrappers come lavoro, e qui ci sono i miei due centesimi sui problemi più difficili che ho dovuto affrontare quando ero dall'altra parte del tuo problema.

  1. Carica alcuni o tutti i contenuti tramite diverse chiamate AJAX. Se lo scrapper non è adattato al tuo sito, questo fermerà gli scrappers. In pratica, si potrebbe rispondere con un JSON che avrebbe solo l'inizio del contenuto e un token nonce che verrebbe richiesto per recuperare la parte successiva del contenuto.

  2. Inoltre, se sai che l'API REST deve essere utilizzata solo dall'app React, puoi aggiungere un token di lunga durata da Django al modello principale di React. Quindi l'API REST richiederebbe l'ID del contenuto e quel token univoco. Nel tuo database, assegnerai quel token a un dato indirizzo IP e lo farai scadere in un tempo ragionevolmente piccolo. Ciò richiederebbe ai robot di recuperare prima il lato HTML dell'applicazione per ottenere quel token e quindi recuperare il contenuto stesso.

  3. La limitazione di solito era un fastidio. Le implementazioni che ho incontrato erano basate sull'indirizzo IP e agli utenti sono state concesse 10 richieste al secondo. È molto più di ciò che un tipico umano farebbe. Per passare questo, il mio codice dovrebbe tenere traccia del tempo in cui sono state inviate dieci richieste e quindi di sospendere il timeout di altre dieci parti di contenuto.

  4. Aggiungi un honeypot al disallow del tuo robots.txt . I robot malvagi non seguono le regole. Anche parte dello stesso lavoro, dovremmo ridistribuire il contenuto e fare in modo che altri lo provassero. Questo è stato il modo più efficace per fermare la maggior parte dei bot: sono stati consentiti tre colpi all'honeypot dopo il quale sono stati inseriti nella lista nera per 36 ore a meno che non siano riusciti a risolvere un captcha (stavamo usando uno strumento esterno per questo). Per l'integrazione con Django, abbiamo usato il codice come middleware per applicarlo a tutte le pagine. Per fare in modo che questo abbia un problema di prestazioni minimo, abbiamo usato la cache di Django per memorizzare quali IP erano nella lista nera o nella whitelist (uno verrebbe aggiunto alla whitelist se riuscissero a risolvere il captcha).

risposta data 25.05.2017 - 01:42
fonte
2

Arrestare gli altri dalla scansione del tuo sito web pubblico / API è un problema difficile.

Puoi provare a limitare la velocità e bloccare gli IP dei client che fanno troppe richieste rapide all'API REST. Ciò può impedire a coloro che utilizzano metodi semplici per eseguire la scansione della tua API REST, ma non ti aiuterà con i crawler che utilizzano tecniche più avanzate. Non sono sicuro di quale sia la tua situazione specifica.

Inoltre, servizi come collegamento possono fornire protezioni contro lo scraping dei dati / la scansione del web che potrebbe essere facile da implementare come un rapido tentativo per affrontare il problema.

    
risposta data 25.05.2017 - 00:40
fonte

Leggi altre domande sui tag