Sono troppo ingegnoso se considero l'errore intenzionale dell'utente?

12

È eccessiva ingegneria se aggiungo protezione contro le violazioni intenzionali di un utente (per usare un eufemismo), se il danno che l'utente può subire non è correlato al mio codice?

Per chiarire, sto esponendo un semplice servizio REST di JSON 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 in sé non è pensato per essere utilizzato attraverso un browser, ma solo da applicazioni di terze parti, controllate dall'utente (come app telefoniche, app desktop, ecc.). Inoltre, il servizio stesso dovrebbe essere senza stato (cioè 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 Basic Auth, lo elabora e memorizza l'auth per la sessione di navigazione corrente. Senza chiudere il browser, l'utente visita un sito Web dannoso che presenta un CSRF / XSRF javascript dannoso che esegue un POST al nostro servizio.

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

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

Dall'altro lato, usa intestazioni personalizzate considerate pura implementazione REST? Posso rilasciare l'autenticazione di base e utilizzare intestazioni personalizzate. In questo modo, almeno l'attacco CSRF da un browser può essere evitato e le applicazioni che utilizzano il servizio imposteranno il nome utente / password in heather personalizzato. Male per questo approccio è, che ora il servizio non può essere consumato da un browser.

    
posta Sunny 18.08.2011 - 20:49
fonte

4 risposte

6

Over-engineering? Affatto. Le misure anti-XSRF sono una parte necessaria di qualsiasi applicazione o servizio Web sicuro. Potrebbe essere o meno "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 anche se i risultati sono meno immediati, ovviamente negativi di SQL-injection o XSS, sono abbastanza brutti da compromettere tutte le funzionalità intercambiabili dall'utente.

Ciò significa che non puoi avere un'interfaccia "pura" RESTful in cui i parametri solo sono le proprietà della chiamata stessa. Devi includere qualcosa nella richiesta che un utente malintenzionato non può indovinare. Quella potrebbe essere la coppia nome utente-password, ma questo è lontano dall'unica scelta possibile. Potresti avere il nome utente insieme al 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).

should I get rid of the GET

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

    
risposta data 18.08.2011 - 22:33
fonte
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 meno probabilità di essere dirottata da un utente malintenzionato. Tutto ciò che serve è una persona intelligente per trovare un modo per proteggere la tua sicurezza nei tuoi guai gravi con i tuoi dati (una delle tue risorse più preziose ).

Se hai identificato un buco di sicurezza nella tua applicazione, fai tutto ciò che pensi di dover fare per colmare il divario. La tua API, in particolare, dovrebbe essere il software di software più inaffidabile esistente. Richiedo le credenziali e vado con le richieste Post.

    
risposta data 18.08.2011 - 20:59
fonte
0

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

FISSAGGIO DOVUTO ALCUNI ERRORI DALLA PARTE MIA:

GET dovrebbe ancora essere usato come parte di un corretto servizio RESTful, l'autenticazione deve essere ancora lì in ogni caso. Quello che stavo cercando di ipotizzare era che per motivi di sicurezza GET è molto simile al POST ma post 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é 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 su questa parte.

    
risposta data 18.08.2011 - 20:56
fonte
0

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

Ma allo stesso tempo dovresti valutare l'impatto di un attacco di successo e la probabilità che si verifichi un tentativo. Ad esempio:

  • Un servizio interno protetto da un firewall solido è meno soggetto ad attacchi rispetto a un servizio su Internet pubblico.

  • L'impatto di qualcuno che abbatte un forum di discussione dei clienti è inferiore all'impatto con cui rubano le carte di credito dei clienti.

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

    
risposta data 19.08.2011 - 00:31
fonte

Leggi altre domande sui tag