Nota:
Molte persone sembrano confondere un URL "privato" con l'autenticazione. Inoltre, sembra esserci una certa confusione sul fatto che l'invio del collegamento tramite un'entità attendibile sia un tentativo di autenticazione a due fattori. Per essere chiari, stiamo parlando di una risorsa accessibile al pubblico, sebbene sia sufficientemente difficile da indovinare.
Quando si utilizza un URL privato, si dovrebbe sempre presumere che possa essere compromesso - è necessario progettare tale URL in modo tale che, anche se compromesso, la risorsa non perda le informazioni all'attaccante.
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 al pubblico. Penso che il termine URL "privato" sia un termine improprio, piuttosto sono URL "oscuri".
Ci sono alcuni casi in cui l'utilizzo di un URL "privato" è accettabile, ma sono intrinsecamente meno sicuri rispetto ai metodi di autenticazione tradizionali come l'autenticazione con password o l'autenticazione basata su chiave.
Alcuni dei luoghi che ho visto comunemente usati URL "privati" sono:
- Email di reimpostazione password
- Email di generazione certificati
- Email di conferma account / email
- Consegna dei contenuti acquistati (ebook, ecc.)
- Altre cose varie come il check-in dei voli, la stampa della carta d'imbarco, l'uso di URL privati oltre all'autenticazione tradizionale
La cosa comune qui è che gli URL casuali sono in genere buoni solo per le operazioni one-shot. Inoltre, l'autenticazione tradizionale e gli URL casuali non si escludono a vicenda , anzi, possono essere utilizzati insieme per fornire ulteriore sicurezza durante la consegna 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 e-mail, SMS, ecc.
Un URL privato / generato in modo casuale 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 rinviare l'autenticazione dell'utente a qualche altra entità di cui si fida per autenticare in modo sicuro l'utente. (Inviando il collegamento via e-mail o SMS, ecc.)
- Dovrebbe essere impossibile per un computer moderno forzare bruscamente l'URL nel periodo precedente la scadenza - o limitando la velocità dell'API che espone la risorsa o creando un endpoint url con entropia sufficiente in modo che non possa essere indovinato.
- Non dovrebbe perdere informazioni sull'utente. IE: se la pagina deve reimpostare una password: la pagina non deve visualizzare le informazioni sull'account dei richiedenti. Se Alice richiede un collegamento per reimpostare la password e Bob indovina in qualche modo l'URL, Bob non dovrebbe avere modo di sapere di chi sta reimpostando la password.
- Se perde informazioni sull'utente, dovrebbe essere utilizzato in aggiunta all'autenticazione tradizionale, ad esempio una pagina può considerare un utente autenticato se ha un cookie impostato o se il suo session_id è ancora valido.
Risorse diverse richiedono diversi livelli di sicurezza. Se vuoi condividere una ricetta segreta con alcuni amici, ad esempio, sarebbe accettabile usare un URL casuale / privato per condividerlo con loro. Tuttavia, se la risorsa potesse essere utilizzata per rubare l'identità di qualcuno o compromettere i propri account con altri fornitori di servizi, è probabile che ti interessi molto di più a limitare l'accesso a tale risorsa.