È 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.