Nota:
Molte persone sembrano confondere un URL "privato" con l'autenticazione. Inoltre, sembra esserci una certa confusione che l'invio del link tramite un'entità fidata è un tentativo di autenticazione a due fattori. Per essere chiari, stiamo parlando di una risorsa accessibile al pubblico, anche se è sufficientemente difficile da indovinare.
Quando si utilizza un URL privato, si dovrebbe sempre presumere che possa essere compromesso: è necessario progettare un URL di questo tipo in modo che, anche nel caso in cui venga compromesso, la risorsa non perderà informazioni all'autore dell'attacco.
Gli URL privati / difficili da indovinare non equivalgono all'autenticazione basata su password. Per natura, gli URL privati non sono affatto privati: sono risorse accessibili pubblicamente. Penso che il termine URL "privato" sia un termine improprio, piuttosto sono URL "oscuri".
Ci sono alcuni casi in cui l'uso di un URL "privato" è accettabile, ma sono intrinsecamente meno sicuri rispetto ai metodi di autenticazione tradizionali come l'autenticazione della password o l'autenticazione basata su chiave.
Alcuni dei luoghi in cui ho comunemente visto gli URL "privati" sono:
- Email di reimpostazione della password
- Email di generazione certificato
- Email di conferma dell'account / email
- Consegna dei contenuti acquistati (e-book, ecc.)
- Altre cose diverse come il check-in di volo, la carta d'imbarco della stampa, l'uso di URL privati oltre all'autenticazione tradizionale
La comunanza qui è che gli URL casuali sono tipicamente validi solo per le operazioni one-shot. Inoltre, l'autenticazione tradizionale e gli URL casuali non si escludono a vicenda , anzi, possono essere utilizzati in combinazione tra loro per fornire ulteriore sicurezza durante il recapito di una risorsa.
Come ha sottolineato Robert Harvey, l'unico modo per utilizzare in modo sicuro un URL casuale / privato è generare la pagina in modo dinamico e inviare l'URL all'utente in modo tale che l'utente possa essere considerato semi-autenticato. Questo potrebbe essere email, SMS, ecc.
Un URL generato in modo casuale / privato ha in genere alcune proprietà:
- Dovrebbe scadere dopo un ragionevole lasso di tempo
- Dovrebbe essere un URL monouso: IE dovrebbe scadere dopo il primo accesso.
- Dovrebbe posticipare l'autenticazione dell'utente ad un'altra entità che si fida per autenticare in sicurezza l'utente. (Inviando il link via email o SMS, ecc.)
- Dovrebbe essere impossibile per un computer moderno forzare bruscamente l'URL nel periodo di tempo che precede la scadenza - sia per la velocità che limita l'API che espone la risorsa sia per la creazione di un endpoint dell'URL con sufficiente entropia tale da non poter essere indovinato. / li>
- Non dovrebbe perdere informazioni sull'utente. IE: se la pagina deve reimpostare una password: la pagina non deve visualizzare le informazioni dell'account del richiedente. Se Alice richiede un link per reimpostare la password e Bob in qualche modo indovina l'URL, Bob non dovrebbe sapere in alcun modo di quale password si sta reimpostando.
- Se perde informazioni sull'utente, dovrebbe essere usato in aggiunta all'autenticazione tradizionale, ad esempio una pagina potrebbe considerare un utente autenticato se ha un set di cookie o se il suo session_id è ancora valido.
Diverse risorse richiedono diversi livelli di sicurezza. Ad esempio, se desideri condividere una ricetta segreta con alcuni amici, sarebbe accettabile utilizzare un URL casuale / privato per condividerlo con loro. Tuttavia, se la risorsa potrebbe essere utilizzata per rubare l'identità di qualcuno o compromettere i propri account con altri fornitori di servizi, probabilmente ci si preoccuperà molto di più di limitare l'accesso a tale risorsa.