Design API PHP semplice e sicuro

6

Sto provando a progettare un servizio web RESTful API sicuro con il minor numero di parti mobili possibile. Ho alcune domande e voglio assicurarmi che il mio design sia sicuro.

Per il livello di sicurezza della trasmissione dei dati, userò SSL / TLS per evitare intercettazioni, MITM, attacchi di riproduzione, ecc.

Ciò che lascia è il controllo degli accessi.

Non desidero combattere con OAuth. Il motivo è che non voglio fare affidamento su una terza parte e configurare server locali in quanto "autenticatore" (o qualsiasi altra cosa OAuth lo chiami) non è fattibile.

Quindi ho deciso di affidarmi a un token casuale. Utilizzando una libreria CSPRNG (ad es., $token = random_bytes(32) in PHP), ho in programma di assegnare ogni nome utente / password a $token e di memorizzarlo nel DB utilizzando una funzione di memorizzazione password (ad esempio, PBKDF2 o bcrypt). Il token verrebbe anche recuperato dall'utente tramite SSL / TLS.

Quindi, a ogni richiesta, l'utente invierà il token insieme ai propri dati JSON. Se il token che passano esiste nel DB, la chiamata API viene elaborata.

Questo mi lascia alcune domande:

  • Il token può essere coerente (a meno di revoca o aggiornamento manuale) oppure il token richiede di essere "aggiornato" frequentemente? Se sì, qual è il modo fattibile per gestirlo? Costringere l'utente ad accedere a una pagina Web per ottenere l'accesso al nuovo token sembra vanificare lo scopo di un'API. Questo sembra indicare che è nel migliore dei casi un punto controverso.
  • Qual è il vantaggio di mettere il token in un'intestazione HTTP (ad esempio Authorization: Token SOMERANDOMVALUE ) anziché semplicemente inserirlo nel corpo di una richiesta JSON? Ad ogni modo, non farò nulla con la richiesta a meno che l'autenticazione non abbia successo. Stavo per metterlo nell'intestazione in ogni caso, ma ero solo curioso.

Inoltre, se qualcuno ha fonti attendibili per saperne di più sulla creazione di API sicure, mi piacerebbe davvero leggerle.

    
posta throwaway934 04.04.2016 - 22:22
fonte

1 risposta

3

Can the token stay consistent (short of revocation or manual refresh), or should the token require being "refreshed" frequently? If so, what is the feasible way to handle that?

Anche se non vuoi implementare OAuth, ti consiglio di dare un'occhiata a come è gestita la gestione dei token fatto in OAuth (paragrafi 1.5 e 1.5) . Con i token di aggiornamento è possibile ridurre la finestra di esposizione se il token al portatore viene compromesso evitando di chiedere ripetutamente agli utenti di fornire le proprie credenziali.

What is the advantage of putting the token in an HTTP header (e.g., Authorization: Token SOMERANDOMVALUE) versus just stuffing it in the body of a JSON request?

AFAIK è fatto perché questo campo di intestazione è inteso per questo scopo. In pratica dipende molto dal caso d'uso. Poiché esiste il rischio che l'intestazione Authorization venga inviata automaticamente da alcuni browser che potrebbero introdurre una vulnerabilità CSRF, potrebbe non essere desiderato eseguirla in questo modo se non si desidera implementare un token CSRF. Quindi aggiungere le informazioni di autenticazione al corpo o un campo di intestazione personalizzato è assolutamente ok.

Dai un'occhiata al Scheda trucchi sulla sicurezza REST di OWASP per ulteriori suggerimenti sulla progettazione sicura dell'API. In realtà l'intero sito è interessante - è un ottimo punto di partenza per sviluppare una migliore comprensione della sicurezza delle informazioni.

    
risposta data 05.04.2016 - 08:55
fonte

Leggi altre domande sui tag