ID negli URL delle risorse: id del database o id per utente?

2

Per le interfacce REST o le webapp con URL di bell'aspetto, mi chiedo continuamente su quali numeri utilizzare se vogliamo fare riferimento a risorse / pagine specifiche.

Un approccio tipico sembra essere quello di utilizzare l'ID di database univoco di una riga che rappresenta la risorsa come un indice come http://www.mypage.com/questions/4/answers .

L'uso dell'ID del database sarebbe semplice, tuttavia, trapelerebbe informazioni per le risorse di altri utenti. Potrei anche immaginare che si possano generare ID personalizzati che sono unici per un solo utente per evitare questa perdita.

Esistono migliori pratiche / consigli disponibili?

    
posta wirrbel 07.06.2015 - 22:41
fonte

2 risposte

3

Se la tua preoccupazione principale è impedire all'utente X di accedere a una risorsa A che è unica per l'utente Y, allora gli ID per utente non risolvono questo problema. Quello di cui hai veramente bisogno è l'autenticazione , cioè un modo sicuro per verificare che una richiesta per la risorsa A venga effettivamente creata dall'utente Y, non solo da un altro utente che finge di Y.

Se non si dispone dell'autenticazione, gli ID per utente sono semplicemente la sicurezza attraverso l'oscurità. Non appena l'utente X scopre quale sia il numero ID magico dell'utente Y per la risorsa A, può ottenere la risorsa A. Se si dispone dell'autenticazione, gli ID per utente non sono necessari, poiché il server può semplicemente rifiutarsi di inviare la risorsa A a chiunque non autenticato come utente Y.

L'unica volta in cui gli ID per utente potrebbero essere d'aiuto è se l'id stesso è informazione segreta o espone indirettamente informazioni segrete. Non riesco a pensare a uno scenario in cui questo sarebbe effettivamente il caso, ma per essere sicuro vorrei generare GUID piuttosto che incrementare un numero di sequenza, poiché il numero di sequenza rivela una piccola informazione (il ordina che le risorse siano state create in) mentre un GUID correttamente generato non rivela sostanzialmente nulla.

tl; dr Non conosco alcun motivo per cui un ID per utente sarebbe utile, a meno che per qualche motivo inspiegabile non sia possibile implementare l'autenticazione corretta o la generazione GUID.

    
risposta data 07.06.2015 - 23:00
fonte
0

Presumo che tu stia parlando di URL indicativi, ovvero, sostituendo il mio "/ 4 /" con un "/ 42 /" per vedere se qualcun altro ha qualcosa sotto link ".

Per quanto ne so, la prima e la migliore prassi migliore è quella di implementare la sicurezza adeguata ovunque, in modo che un utente che non ha il permesso di vedere qualcosa non sarà mai in grado di vederlo, anche se ne indovina l'URL.

Ovviamente questo non funzionerà se vuoi che i tuoi utenti siano in grado di condividere le loro cose con persone che non hanno un account sul tuo sito web. In questi casi, ogni URL deve essere pubblico, quindi è necessario assicurarsi che non sia rilevabile. Per questo, puoi usare la seconda migliore pratica, che è l'hashing. Quindi, "/ 4 /" verrebbe sostituito con "/ 2klty046vjzm9fy /". Molti grandi siti web lo fanno, ad esempio dropbox. Registrati per un account Dropbox gratuito, carica un file, chiedi a dropbox di darti il suo link pubblico e vedrai che il suo url contiene un tale hash. Quindi, carica un altro file, chiedi il suo link pubblico e vedrai che l'hash di quel file è completamente diverso, quindi non è il tuo id per utente, è qualcosa di unico. I documenti Google fanno la stessa cosa per i documenti che desideri mostrare agli utenti che non hanno account Google.

A giudicare dalla tua reputazione, probabilmente sai come creare un hash; in caso contrario, potrebbe essere l'argomento di un'altra domanda.

    
risposta data 07.06.2015 - 23:03
fonte

Leggi altre domande sui tag