Come proteggere i miei endpoint API

7

Ho un'API scritta in nodejs e ho un frontendapp scritto in angularjs. Voglio che la mia API venga chiamata solo tramite il mio frontendapp e non da qualsiasi altra fonte.

es. Ho un endpoint chiamato myhost.com/posts/id e quando il metodo è eliminato cancella i post. Non desidero che un utente malintenzionato acceda a questo endpoint e cancelli i miei post. Come posso impedirlo?

    
posta Avraam Mavridis 11.11.2014 - 11:10
fonte

3 risposte

6

Credo che questo non sia possibile in un modo sicuro, sfortunatamente. Lasciami spiegare perché.

Vuoi che la tua app di frontend abbia un modo per identificarsi con l'API. In altre parole, vuoi l'autenticazione.

Ma l'autenticazione richiede l'esistenza di qualche tipo di dati segreti unici che l'applicazione front-end può utilizzare per distinguersi dalle altre applicazioni. Questo può essere un segreto condiviso (password, "chiave API"), una chiave crittografica privata asimmetrica o qualcos'altro ancora. Ma qualunque esso sia, deve rimanere un segreto, poiché se un'altra app può copiarlo, può passare come app di frontend.

Quindi la domanda è: dove hai intenzione di memorizzare quel segreto?

Se è memorizzato all'interno del codice dell'applicazione stesso o direttamente accessibile, è vulnerabile al reverse engineering o agli exploit nell'app di front-end, indipendentemente dal numero di livelli di riferimento indiretto crittografico che si utilizzano per nasconderlo. Questo è il difetto di sicurezza fondamentale che ha portato al fallimento di quasi tutti i regimi di DRM inventati fino ad oggi.

Se è memorizzato in una posizione a prova di manomissione della macchina client (ad esempio, chip TPM, sistema di gestione delle chiavi del sistema operativo affidabile), allora la domanda diventa, come ci si arriva inizialmente? E come hai intenzione di accedervi dal codice Javascript, che ha limitate capacità di accesso al SO di basso livello?

Se è memorizzato in remoto, stai solo spostando il problema dell'autenticazione delle app altrove: in che modo la tua app di front-end procederà all'autenticazione sul server remoto? O in altre parole, cosa impedisce ad un'altra app di accedere a quel server remoto esattamente nello stesso modo?

La mia conclusione è che non esiste un modo veramente sicuro per autenticare un pezzo di software JS. Dovrai progettare la tua API in un modo che sia sicuro dall'input del client malevolo e, se vuoi comunque un modo per escludere i client compromessi, fornire ai client "chiavi API" revocabili che puoi facilmente escludere dal lato server, il modo in cui la maggior parte dei servizi Web (e dei nuovi DRM) lo fanno.

    
risposta data 11.11.2014 - 14:07
fonte
3

Un buon modo per iniziare è impedire le connessioni all'applicazione API da qualsiasi cosa, eccetto gli indirizzi client validi, nel tuo caso, il tuo server angularjs.

Maggiore sicurezza si otterrebbe implementando una chiave API condivisa revocabile tra ogni istanza angularjs e la tua API, in modo da poter revocare le autorizzazioni da istanze compromesse.

Inoltre, è bene confermare che il traffico tra l'app frontend e il server API sia crittografato, anche se si trova solo sulla rete interna.

    
risposta data 11.11.2014 - 14:52
fonte
0

Se il tuo front-end può utilizzare l'API, chiunque può utilizzare l'API. In questo caso, il tuo front-end / browser è solo un livello di astrazione per chiamare la tua API, nulla impedisce a qualcuno di eliminare quel livello di astrazione e chiamare l'API da solo.

Non puoi chiedere in modo affidabile "questa chiamata API provenga dal mio front-end", perché chiunque può mentire nella chiamata API e dire che proviene dal tuo front-end.

Si potrebbe pensare di poter fare in modo che il server Web ti dia qualche tipo di chiave quando apri la pagina per la prima volta, memorizzi la chiave sul browser e poi la invii con ogni chiamata API. Ma cosa impedisce a qualcuno di ottenere quella chiave una volta dal tuo server web e quindi di utilizzare l'API maliziosamente? Se il browser può richiedere la chiave, chiunque può richiedere la chiave.

Per limitare l'accesso, è necessaria una qualche forma di autorizzazione. Quindi la tua API deve dire "è questa persona che vuole eliminare i post autorizzati a farlo?". In questo caso non importa e non dovrebbe importare da dove proviene la chiamata API, solo se la persona che chiama questa API ha l'autorizzazione giusta per farlo.

Un modo per farlo è implementare una sorta di funzionalità di accesso e su un accesso riuscito, rendere il server recuperare una chiave univoca. Il server dovrebbe sapere in un modo o nell'altro che questa chiave è stata fornita dal server a questo utente. È possibile farlo ricordando che questa chiave appartiene a quell'utente sul server o utilizzando qualcosa come un token Web JSON. Idealmente dovresti usare qualche tipo di libreria o framework per eseguire questa autenticazione. Con ogni chiamata API, puoi inviare questa chiave e il server saprà che sei autorizzato a eseguire questa azione, sia che tu abbia fatto clic sul pulsante di front-end destro o se utilizzi qualche altro programma per effettuare la chiamata.

    
risposta data 26.07.2018 - 16:20
fonte

Leggi altre domande sui tag