Protezione di una API REST accessibile al pubblico

20

Stiamo costruendo un'app pubblica a pagina singola in JavaScript che comunica con un servizio REST back-end. Ciò che vogliamo è che il servizio REST sia accessibile solo dall'app della singola pagina.

Poiché si tratta di un sito web pubblico, non possiamo / non vogliamo che l'utente inserisca i dettagli di autenticazione. Qualsiasi normale meccanismo di autenticazione non funzionerà in quanto qualsiasi segreto memorizzato in JS è leggibile da chiunque.

Penso che sia impossibile proteggere il servizio REST, dato che fondamentalmente deve essere pubblico, ma mi chiedevo se qualcuno avesse un'idea di come impedirebbe a qualcuno di creare uno script e riprodurre la nostra applicazione usando la nostra API REST.

    
posta Kenneth 16.05.2014 - 00:08
fonte

3 risposte

5

Il primo pensiero che ti viene in mente è quello di utilizzare le sessioni o impostare qualcosa sulla tua pagina per registrare gli IP delle connessioni in entrata e consentire all'API REST di rispondere solo agli IP che hanno recentemente effettuato l'accesso alla tua pagina principale. Ciò non impedirà tutti i casi, ma significa che qualcuno deve almeno accedere periodicamente al sito principale per utilizzare l'API REST.

Fondamentalmente, se gli utenti non sono tenuti ad autenticare, non c'è nulla che impedisca a uno screen ripper di estrarre efficacemente i dati dal tuo sito. Le regole aziendali devono essere applicate dall'API REST e quindi l'API REST dovrebbe essere effettivamente il tuo sito Web e la pagina che lo utilizza dovrebbe semplicemente fornire la formattazione per la visualizzazione.

    
risposta data 16.05.2014 - 15:35
fonte
8

Se questo è per le app native , puoi provare quanto segue,

  1. Archivia una chiave di accesso nel tuo pacchetto di app. Nessuno a parte il proprietario dell'app (te stesso) può avere questo.
  2. Modifica la tua API in modo che solo le richieste con la chiave di accesso impostata nell'intestazione abbiano esito positivo.
  3. Utilizza HTTPS in modo che nessuno possa leggere la chiave di accesso crittografata.

Se non utilizzi HTTPS, puoi ancora hash manualmente la chiave di accesso con qualcosa nell'intestazione (solo la logica del server e della app sa come) in modo che l'uomo nel mezzo non possa fingere di essere la tua app.

Se questo è per applicazioni web pure,

Per prima cosa suggerirei di avvolgere l'app web pura all'interno di un'app nativa (a.k.a. Hybrid app) in modo da poter ottenere la protezione descritta sopra, raggruppando una chiave segreta all'interno dell'app. Lo sviluppo di un'app nativa con una singola vista web all'interno non dovrebbe costare troppo.

Tuttavia, se ciò non è possibile, la tua app rimane una pura app web - questa è un'opzione potenziale,

  1. Quando il server serve l'app Web, fornire un codice di accesso.
  2. Quando l'app Web effettua chiamate API, è necessario fornire una versione hash della chiave di accesso.
  3. In che modo gli hash delle app Web dipendono dalla logica implementata in codici miniati + offuscati.
  4. L'API di back-end quindi convalida l'hash applicando la stessa logica nascosta alla chiave di accesso archiviata per calcolare l'hash e verificare se corrisponde.
  5. Puoi modificare la logica nascosta e la chiave di accesso con la frequenza necessaria per ridurre la possibilità che qualcuno ottenga l'hash giusto.

Ovviamente non è a prova di proiettile, ma come sapete, non esiste una sicurezza perfetta e questo probabilmente raggiunge lo scopo (e si spera che risponda al conto). Direi che l'ibrido è più economico però.

    
risposta data 26.05.2014 - 09:42
fonte
0

Questo potrebbe aiutare. Ci sono molti aspetti che puoi fare per proteggere il tuo servizio di riposo. Uno è CORS e utilizza PUT / Elimina poiché queste intestazioni non possono essere impostate su un dominio incrociato. link

    
risposta data 19.05.2014 - 08:29
fonte

Leggi altre domande sui tag