2010-02-15 8 views
27

Sono interessato ad ascoltare quali approcci sono stati adottati dalle persone durante la creazione di un'API RESTful (o quasi-RESTful) per le loro applicazioni Web.Quali sono alcune tecniche valide per combinare la protezione CSRF con le API RESTful?

Un esempio pratico:

Diciamo che avete un tradizionale applicazione web basata su browser che utilizza la protezione CSRF in tutti i moduli. Un input nascosto con un token di protezione CSRF è incluso in ogni modulo presentato nel browser. Al momento dell'invio del modulo, se questo input non corrisponde alla versione del token lato server, il modulo è considerato non valido.

Ora dire che si desidera esporre l'applicazione Web come un'API (magari usando JSON anziché HTML). Tradizionalmente, quando pubblichiamo un'API, ho considerato le transazioni unilaterali (nel senso che l'utente dell'API costruisce la richiesta in base all'API pubblicata invece di richiedere prima un modulo e quindi di creare una richiesta utilizzando il modulo restituito).

L'approccio "unilaterale" si interrompe quando elementi come il fattore di protezione CSRF. Il token di protezione CSRF deve essere incluso in tutti i POSTI/PUTS/DELETES inviati dal consumatore dell'API.

Ho cercato di pensare al modo migliore per affrontare questo. Richiedere un modulo ogni volta che è necessario effettuare una chiamata API sembra molto imbarazzante (specialmente quando si ha a che fare con operazioni asincrone), ma tutte le altre alternative che ho pensato da sole sembrano sconfiggere la protezione CSRF (o almeno dei buchi in esso)), che è inaccettabile.

Qualcuno di voi ha un'idea di questo?

Grazie.

(Non che dovrebbe essere troppo importante, poiché il problema è concettuale e indipendente dalla piattaforma, ma ho a che fare con uno stack LAMP tradizionale e utilizzare Symfony 1.4 come framework dell'applicazione. Il mio obiettivo è pubblicare un formato JSON web API che consente agli sviluppatori di creare app mobili/desktop che funzionano con un'applicazione Web esistente.

risposta

2

REST va abbastanza bene con l'autenticazione (ad esempio l'autenticazione di base), quindi provare a utilizzare il nome utente del sito dell'utente e la password specifici per un'applicazione legato a quell'utente - tecnica a volte chiamata chiave API. Qualcosa che l'API di FriendFeed sta facendo see the documentation.

alcune note difficili:

  • uso Autenticazione o SSL
  • avendo di per applicazione chiave API può essere un po 'di un sovraccarico, quindi la maggior parte dei siti hanno chiave API unico per tutte le applicazioni 3rd party
  • OAuth potrebbe valere la pena di verificare
+0

Grazie per la vostra risposta. Come oggi, l'API utilizzerà effettivamente l'autenticazione HTTP, ma la mia preoccupazione è che questo da solo non può risolvere il problema CSRF (se l'app non richiede la protezione CSRF quando le credenziali sono state incluse, questo potrebbe essere sfruttato tramite altri agenti utente che usa HTTP auth ... un feed RSS/ATOM autenticato, per esempio). Darò sicuramente un'occhiata più da vicino a come una chiave API potrebbe aiutare questo problema, ma a prima vista non penso che risolva il problema principale. Grazie ancora per il vostro aiuto. –

+1

Pensaci in questo modo: CSRF è un problema se un altro sito Web (dannoso) può riprodurre/imitare la richiesta come se provenisse da una fonte valida (nel tuo caso applicazione di terze parti), se usi l'autenticazione HTTP proveniente dal prompt del browser che sarebbe un problema (il browser memorizzerà l'autenticazione in cache e la ripeterà nell'intestazione Autorizzazione nelle richieste successive); ma le richieste di terze parti provenienti da AJAX/i client standalone devono inserire l'intestazione Autorizzazione nella richiesta e, in tal caso, il browser non memorizzerà nella cache/ripeterà l'intestazione, impedendo la presenza di CSRF dannosi. –

+0

Sì, penso che siamo sulla stessa pagina. Speravo di evitare una chiave API a causa del pubblico di destinazione, ma questa potrebbe davvero essere la strada da percorrere. Sto ancora considerando l'approccio "richiedi un modulo per ogni richiesta", ma non mi piace molto. Grazie ancora. –

Problemi correlati