Sono troppo ingegnerizzato se considero un errore intenzionale dell'utente?


12

È eccessivamente ingegneristico se aggiungo protezione contro illeciti intenzionali di un utente (per dirla leggermente), se il danno che l'utente può subire non è correlato al mio codice?

Per chiarire, sto esponendo un semplice servizio JSON RESTful come questo:

GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item

Il servizio stesso non è pensato per essere utilizzato tramite un browser, ma solo da applicazioni di terze parti, controllate dall'utente (come app telefoniche, app desktop, ecc.). Inoltre, il servizio stesso dovrebbe essere apolide (ovvero senza sessione).

L'autenticazione viene eseguita con l'autenticazione di base su SSL.

Sto parlando di un possibile comportamento "dannoso" come questo:

L'utente inserisce l'URL GET in un browser (nessun motivo ma ...). Il browser richiede l'autent di base, lo elabora e memorizza l'autent per la sessione di navigazione corrente. Senza chiudere il browser, l'utente visita un sito Web dannoso, che ha un javascript CSRF / XSRF dannoso che effettua un POST al nostro servizio.

Lo scenario di cui sopra è altamente improbabile e so che dal punto di vista commerciale non dovrei preoccuparmi troppo. Ma per migliorare la situazione, pensi che se anche il nome utente / la password sono richiesti nei dati POST JSON, ti aiuteranno?

O dovrei eliminare completamente l'autent di base, sbarazzarmi del GET e utilizzare solo POST / PUT con le informazioni di autorizzazione in essi? Poiché le informazioni recuperate tramite GET possono anche essere sensibili.

Dall'altro lato, l'utilizzo di intestazioni personalizzate è considerato pura implementazione REST? Posso eliminare l'autent di base e utilizzare intestazioni personalizzate. In questo modo, è possibile evitare almeno l'attacco CSRF da un browser e le applicazioni che utilizzano il servizio imposteranno nome utente / password in heather personalizzato. Male per questo approccio è che ora il servizio non può essere utilizzato da un browser.


3
Oltre alla mia risposta, vorrei anche lasciare questa affermazione, penso che probabilmente si avrebbe una risposta migliore su SO o Sicurezza
Jeff Langemeier,

1
Penso che tu abbia cambiato PUT e POST come definito da RFC 2616 ( tools.ietf.org/html/rfc2616#section-9.5 ).
Svante,

Risposte:


6

Over-engineering? Affatto. Le misure anti-XSRF sono una parte necessaria di qualsiasi applicazione o servizio Web sicuro. Potrebbe essere "altamente improbabile" che qualcuno scelga di attaccarti, ma ciò non rende il tuo software meno insicuro.

I sistemi sono stati comunemente attaccati usando XSRF e, sebbene i risultati siano meno immediatamente-ovviamente negativi dell'iniezione SQL o XSS, sono abbastanza cattivi da compromettere tutte le funzionalità interagibili dall'utente.

Ciò significa che non è possibile avere un'interfaccia RESTful "pura" in cui gli unici parametri sono le proprietà della chiamata stessa. Devi includere qualcosa nella richiesta che un utente malintenzionato non può indovinare. Che potrebbe essere la coppia nome utente-password, ma questo è lontano dalla scelta possibile solo. Potresti avere un nome utente insieme a un token generato da un hash salato della password. Potresti avere token emessi dal servizio stesso al momento dell'autenticazione (che potrebbero essere ricordati nella sessione o verificati crittograficamente).

dovrei sbarazzarmi del GET

No, le richieste GET vengono utilizzate per le richieste di lettura che non hanno alcuna operazione di scrittura attiva (sono "idempotenti"). Sono solo le operazioni di scrittura che richiedono la protezione XSRF.


Cosa succede se la richiesta GET può rivelare informazioni riservate?
Sunny,

@Sunny: cosa stai considerando i dati sensibili?
Chris,

2
Chris, se divento paranoico, ogni dato è sensibile, se viene ricevuto dall'utente "sbagliato" :). È teorico
Sunny

per favore, rivedi le modifiche alla domanda che ho aggiunto.
Sunny

1
Va bene che la risposta (sia GET o altro metodo) contenga dati che solo l'utente dovrebbe vedere. Un attacco XSRF consente all'utente malintenzionato di fare in modo che l'utente faccia una particolare richiesta, non consente loro di leggere la risposta che ritorna da quella richiesta. A meno che lo script di destinazione non sia costruito in modo speciale per consentire alle pagine di terze parti di leggerlo da un <script>tag, deliberatamente ("JSONP") o accidentalmente ( JSON non protetto ).
bobince

32

Non fidarti mai di nulla. Ogni richiesta è un attacco. Ogni utente è un hacker. Se sviluppi con questa mentalità, la tua applicazione sarà molto più sicura, stabile e con meno probabilità di essere dirottata da un utente malintenzionato. Tutto ciò che serve è una persona intelligente per trovare un modo per aggirare la tua sicurezza e metterti in seria difficoltà con i tuoi dati (una delle tue risorse più preziose ).

Se hai identificato una falla nella sicurezza della tua applicazione, fai tutto ciò che pensi di dover fare per colmare il divario. La tua API, in particolare, dovrebbe essere il software più poco affidabile esistente. Richiederei le credenziali e andrei con Posta richieste.


4
YAY per la paranoia! Hai nemici! (E +1 per ogni richiesta è un attacco )
Treb

0

Se il codice viene stabilito e mantenuto, i casi limite dovrebbero essere esaminati e trattati caso per caso.

FISSAGGIO DOVUTO ALCUNI ERRORI DA PARTE MIA:

GET dovrebbe essere comunque utilizzato come parte di un servizio RESTful adeguato, l'autenticazione deve essere comunque presente. Quello che stavo cercando di ipotizzare era che per motivi di sicurezza GET è molto simile a POST ma la posta fa il suo lavoro senza mettere le informazioni in una barra degli indirizzi, che tende ad essere la grande differenza di sicurezza (e perché non mi piace GET), ma come pubblicato da @Lee,

GET requests are used to retrieve resources, and PUT/POST are used to add/update 
resources so it would be completely against expectations for a RESTful API to use
PUT/POST to get data. 

Poiché questo verrà utilizzato da applicazioni di terze parti, è necessario seguire le buone pratiche per un servizio RESTful in modo che l'implementatore finale non venga confuso da questa parte.


3
In che modo GET differisce dal POST in termini di sicurezza? Entrambi vengono inviati in chiaro sul trasporto (HTTP o HTTPS), l'unica differenza è che le stringhe di query GET sono visibili nella barra degli indirizzi.
martedì

1
@Sunny: POST è altrettanto esposto come GET in questo senso. Avvia telnet e parla con un server web se non mi credi.
martedì

1
@Jeff: il motivo per cui sto richiamando telnet (o curl, wget o un buon vecchio sniffer) è che ti permette di vedere l'intero flusso di dati. Sì, HTTPS nasconde queste informazioni agli intercettatori, ma chiunque alle due estremità della connessione SSL può vedere esattamente ciò che vede telnet.
martedì

1
@Jeremy: POST non mostra i parametri nella barra degli indirizzi, ma poiché i dati sono altrettanto visibili nel flusso HTTP effettivo, hai ragione nel complesso.
martedì

7
Le richieste GET vengono utilizzate per recuperare le risorse e PUT / POST vengono utilizzate per aggiungere / aggiornare le risorse, quindi sarebbe completamente contro le aspettative che un'API RESTful utilizzasse PUT / POST per ottenere dati.
Lee,

0

Dovresti considerare tutte le eventualità plausibili, incluso l'utente che è attivamente malizioso e (con successo) decodifica qualsiasi barriera di "sicurezza per oscurità".

Allo stesso tempo, dovresti valutare l'impatto di un hack di successo e la probabilità che si verifichi un tentativo. Per esempio:

  • Un servizio interno protetto da un solido firewall ha meno probabilità di essere soggetto ad attacchi rispetto a un servizio su Internet pubblico.

  • L'impatto di qualcuno che sta eliminando un forum di discussione dei clienti è inferiore all'impatto che hanno rubato le carte di credito dei clienti.


Il mio punto è che la "sicurezza totale" è "infinitamente costosa" ... e praticamente irrealizzabile. Idealmente, dovresti prendere le tue decisioni su dove tracciare la linea sulla base di un'analisi costi-benefici approfondita.


Grazie. La domanda non riguardava la protezione "dall'" utente, ma la protezione dell'utente stesso se agisce in modo irresponsabile. Ma la tua risposta fa alcuni buoni punti.
Sunny
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.