2012-03-28 7 views
5

È una cattiva pratica esporre gli ID interni DB negli URL?È una cattiva pratica esporre gli ID interni DB negli URL?

Ad esempio, supponiamo di avere una tabella users con alcuni ID (chiave primaria) per ogni riga. Esporre l'URL myapp.com/accountInfo.html?userId=5, dove 5 è una chiave primaria effettiva, essere considerata una "cosa negativa" e perché?

Supponiamo anche che difendiamo adeguatamente contro le iniezioni SQL.

Sono principalmente interessato alle risposte relative allo stack di tecnologia Web Java (da cui il tag java), ma anche le risposte generali saranno molto utili.

Grazie.

risposta

7

Che si basa sul modo in cui si analizza l'URL. Se si consentono iniezioni SQL cieche che è male. Devi solo convalidare l'id dall'input dell'utente.

Stackexchange inserisce inoltre l'ID della riga nell'URL, come si può vedere nella barra degli indirizzi. Il trucco è quello di analizzare la parte e ottenere fatto di tutto il possibile SQL. Il modo semplice è verificare che l'id sia un numero.

+0

Sì.Supponiamo che difendiamo adeguatamente dalle iniezioni. – Simeon

+0

In questo caso non è un problema, forse solo alcuni elementi SEO se non si utilizzano gli URL "user friendly". – rekire

+0

Esattamente la mia opinione, grazie. – Simeon

7

Non è un brutto passaggio nell'URL, in quanto non significa molto per l'utente finale - è solo negativo se si basa su quel valore nell'esecuzione della propria applicazione. Ad esempio, non si desidera che l'utente noti tale ID utente = 5 e lo modifichi in userID = 10 per visualizzare l'account di un'altra persona.

Sarebbe molto più sicuro archiviare queste informazioni in una sessione sul server. Ad esempio, quando l'utente esegue l'accesso, il relativo valore userID viene archiviato nella sessione sul server e viene utilizzato questo valore ogni volta che si esegue una query nel database. Se lo fai in questo modo, di solito non c'è bisogno di passare attraverso l'userID nell'URL, tuttavia non danneggerebbe perché non è usato dal tuo codice di interrogazione DB.

0

Per utilizzare l'ID del database negli URL è buono, perché questo ID non dovrebbe mai cambiare in una vita di oggetti (righe db). Quindi l'URL è durevole - l'aspetto più importante di un URL. Vedi anche Cool URIs don't change.

+0

Potrebbe il down-voter spiegare la sua opinione? – deamon

+0

questo è stato estremamente utile, grazie – Simeon

+0

Molto, molto sbagliato. Non appena lo fai, il tuo database diventa un ostacolo al cambiamento. –

2

Sì, è una brutta cosa. Stai esponendo i dettagli di implementazione. Quanto male? Dipende. Ti costringe a fare controlli non necessari sull'input dell'utente. Se altre applicazioni iniziano a dipendere da questo, non sei più libero di modificare lo schema del database.

+0

Le chiavi primarie IMO non possono essere modificate comunque una volta in produzione. E anche se non sono in produzione, non è possibile cambiarli comunque poiché altri tavoli potrebbero dipendere da loro. Inoltre, in generale, non vedo alcun beneficio che si otterrebbe nel cambiare le chiavi primarie. Devi esporre * alcuni * dettagli di implementazione dal momento che i tuoi URL hanno bisogno di alcuni parametri per poter visualizzare un utente (se stai utilizzando la navigazione URL per quello che è). – Simeon

+0

@Simeon: ovviamente le chiavi primarie cambiano. Soprattutto quando si riprogetta il modello di dati. Non lavoro in un contesto di cascata. La mappatura al database non dovrebbe essere esposta a nessun client. Potrei voler usare un diverso livello di archiviazione. –

0

I PK sono pensati per il sistema.
Per l'utente, può rappresentare un significato diverso:
Ad es. Consideriamo i seguenti collegamenti. Usando la chiave primaria, visualizza un oggetto sotto i prodotti
prodotto A, prodotto B, prodotto C;

(A)http://blahblahsite.com/browse/productA/111 (pkey)
(B)http://blahblahsite.com/browse/productB/112 (pkey)
(C)http://blahblahsite.com/browse/productC/113 (pkey)
utente su collegamento B può sentire ci sono 112 articoli sotto ProductB, che è fuorviante.

Inoltre causerà problemi durante l'unione di tabelle poiché PK verrà incrementato automaticamente.

+0

Non penso che gli URL facciano parte dell'esperienza utente. Nessuno scrive più URL, io stesso non presto mai attenzione a loro, se non sto sviluppando qualcosa. Quindi il fatto che sia fuorviante non mi sembra molto preoccupante. Sono d'accordo con l'argomento dell'auto-incremento comunque. – Simeon

+0

Se si esaminano gli URL di stackexchange, contengono anche diversi numeri che, se non correlati a DB, sono fuorvianti. – Simeon