Esporre gli ID del database - rischio per la sicurezza?


134

Ho sentito che esporre gli ID del database (ad esempio negli URL) è un rischio per la sicurezza, ma ho difficoltà a capire il perché.

Qualche opinione o collegamento sul perché è un rischio o perché non lo è?

EDIT: ovviamente l'accesso è mirato, ad esempio se non riesci a vedere la risorsa foo?id=123otterrai una pagina di errore. Altrimenti l'URL stesso dovrebbe essere segreto.

MODIFICA: se l'URL è segreto, probabilmente conterrà un token generato che ha una durata limitata, ad esempio valido per 1 ora e può essere utilizzato solo una volta.

EDIT (mesi dopo): la mia attuale pratica preferita per questo è usare UUIDS per ID ed esporli. Se sto usando numeri sequenziali (di solito per prestazioni su alcuni DB) come ID, mi piace generare un token UUID per ogni voce come chiave alternativa ed esporlo.

Risposte:


109

Date le condizioni adeguate, l'esposizione degli identificatori non costituisce un rischio per la sicurezza. E, in pratica, sarebbe estremamente oneroso progettare un'applicazione web senza esporre identificatori.

Ecco alcune buone regole da seguire:

  1. Utilizzare la sicurezza basata sui ruoli per controllare l'accesso a un'operazione. La modalità dipende dalla piattaforma e dal framework scelti, ma molti supportano un modello di sicurezza dichiarativo che reindirizzerà automaticamente i browser a un passaggio di autenticazione quando un'azione richiede una certa autorità.
  2. Utilizzare la sicurezza programmatica per controllare l'accesso a un oggetto. Questo è più difficile da fare a livello di quadro. Più spesso, è qualcosa che devi scrivere nel tuo codice ed è quindi più soggetto a errori. Questo controllo va oltre il controllo basato sui ruoli garantendo non solo che l'utente disponga dell'autorizzazione per l'operazione, ma abbia anche i diritti necessari sull'oggetto specifico che viene modificato. In un sistema basato sui ruoli, è facile verificare che solo i manager possano dare rilanci, ma oltre a ciò, è necessario assicurarsi che il dipendente appartenga al reparto del manager specifico.
  3. Per la maggior parte dei record del database, le condizioni 1 e 2 sono sufficienti. Ma l'aggiunta di ID imprevedibili può essere pensata come una piccola assicurazione extra, o "sicurezza in profondità", se si acquista in quella nozione. Un luogo in cui identificatori imprevedibili è una necessità, tuttavia, è negli ID di sessione o in altri token di autenticazione, in cui l'ID stesso autentica una richiesta. Questi dovrebbero essere generati da un RNG crittografico.

27
IMO, l'aggiunta di ID imprevedibili è un approccio di "sicurezza attraverso l'oscurità" e può portare a un falso senso di sicurezza. È meglio concentrarsi su (1) e (2) e assicurarsi che il controllo degli accessi sia solido.
Stucampbell

4
L'uso di un RNG crittografico non è sicuramente "sicurezza attraverso l'oscurità". L'attaccante non è più vicino a indovinare gli identificatori di oggetti anche quando sa come generarli. La sicurezza attraverso l'oscurità significa che se viene scoperto l'algoritmo che stai utilizzando, può essere sfruttato. Non si riferisce al mantenimento di segreti, come chiavi o lo stato interno di un RNG.
Erickson,

1
@stucampbell Forse, ma ciò non significa che non dovresti usare ID imprevedibili. I bug si verificano, quindi gli ID imprevedibili sono un meccanismo di sicurezza aggiuntivo. Inoltre, il controllo degli accessi non è l'unico motivo per usarli: gli ID prevedibili possono rivelare informazioni sensibili come il numero di nuovi clienti entro un determinato periodo di tempo. Non vuoi davvero esporre tali informazioni.
user247702

1
@Stijn non puoi davvero dire che "davvero non voglio" esporre quanti clienti ho. Voglio dire, McDonald's ha un enorme cartello che dice che hanno servito 10 miliardi di hamburger. Non è affatto un rischio per la sicurezza, è una preferenza. Inoltre, devi accedere prima di vedere gli URL nella maggior parte delle applicazioni in cui dovremmo preoccuparci comunque. Pertanto, sapremmo chi stava raccogliendo i dati.
Wayne Bloss,

1
Una cosa che non ho visto menzionato in questa conversazione è che dal punto di vista della risoluzione dei problemi e della facilità d'uso, può essere molto utile avere gli ID esposti in un URL per aiutare gli utenti a una risorsa specifica o farli essere in grado per dirti esattamente quale risorsa stanno visualizzando. Per lo più puoi evitare i problemi di business intelligence avviando l'incremento automatico a un valore più alto, solo per offrire un'idea.
Chockomonkey,

47

Pur non rappresentando un rischio per la sicurezza dei dati, questo è assolutamente un rischio per la sicurezza di business intelligence in quanto espone sia la dimensione che la velocità dei dati. Ho visto le aziende essere danneggiate da questo e ho scritto a fondo di questo anti-pattern. A meno che tu non stia solo costruendo un esperimento e non un business, ti consiglio vivamente di tenere i tuoi ID privati ​​al di fuori dell'opinione pubblica. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e


4
Infine, una risposta sana porta altri aspetti oltre al rischio per la sicurezza.
peceps

2
Questa dovrebbe essere la risposta accettata. Se supponi che l'attaccante possa bypassare la tua sicurezza (cosa che dovresti sempre fare), non vuoi semplicemente consegnare questo tipo di informazioni.
Kriil

@Kriil Non hanno nemmeno bisogno di aggirare la tua sicurezza. Devono solo creare un account!
Peter

32

Dipende da cosa significano gli ID.

Considera un sito che per motivi competitivi non vuole rendere pubblico il numero di membri che possiede, ma utilizzando ID sequenziali lo rivela comunque nell'URL: http://some.domain.name/user?id=3933

D'altra parte, se invece hanno utilizzato il nome di accesso dell'utente: http://some.domain.name/user?id=some non hanno rivelato nulla che l'utente non conosceva già.


2
se stai usando ID sequenziali hai ragione, ma in caso contrario questo non espone nulla
orip

@orip: Come ho detto, dipende da cosa qualcuno può scoprire esaminando diversi ID. C'è uno schema? Possono usare tali informazioni per ottenere informazioni che non sono destinate a possedere?
circa il

@Giovanni: grazie per la modifica. L'inglese non è la mia lingua madre :)
circa il

6
Ho fatto esattamente questo: ho usato numeri ID sequenziali per determinare la dimensione della base utenti di un concorrente.
Michea il

3
Loro sono ovunque. Molti siti di acquisti utilizzano un numero progressivo per l'ID ordine. Effettua un ordine ad una data e uno ad un'altra data e sai quanti ordini hanno ricevuto durante quel periodo. Anche se non sai quanti soldi valgono gli ordini, ricevi comunque un'indicazione di come va bene il business.
circa il

25

Il pensiero generale segue questa linea: "Rivela a chiunque poche informazioni sul funzionamento interno della tua app".

Esporre l'ID del database conta come divulgare alcune informazioni.

Le ragioni di ciò sono che gli hacker possono utilizzare qualsiasi informazione sui meccanismi interni delle tue app per attaccarti o che un utente può modificare l'URL per accedere a un database che non suppone di vedere?


1
Accedendo alle risorse che non dovrebbero vedere, solo se non controllo le autorizzazioni (cosa che faccio, altrimenti ho un diverso problema di sicurezza). Divulgare informazioni sui "meccanismi interni" - questa è esattamente la mia domanda. Perché è un problema?
orip

8
@orip: si tratta di essere il più sicuro possibile. Se sei il tipo di programmatore che non commette errori, non è un problema. Altrimenti, esporre meno dettagli rende più difficile sfruttare il tuo codice se (quando) commetti errori. Di per sé, hai ragione, non aggiunge sicurezza.
Adam Bellaire,

@Adam: la sicurezza superficiale può essere peggio di nessuna sicurezza. Senza sicurezza sei esplicito, con sicurezza superficiale potresti pensare che aggiunga qualcosa di non debole.
orip

16

Utilizziamo GUID per gli ID del database. Perdere è molto meno pericoloso.


Questo è ciò che suggerirei. Molto meno probabilità di indovinare i GUID nel database.
Jon Erickson,

6
Ciò comporta una penalità per le prestazioni. Vedi qui
Jeshurun,

2
La cosa interessante 1 sull'uso delle guide è che puoi consentire ai client di generare ID di database. La cosa interessante 2 è che non hanno alcun problema con database frammentati come fanno gli ID con autoincremento.
Brian White,

Usi questi GUID anche nel codice html come attributi id per identificare utenti, commenti, post? Per indicare a quale link ha fatto clic un utente o quale post desidera commentare?
trzczy,

7

Se stai usando ID interi nel tuo db, potresti rendere più semplice per gli utenti vedere i dati che non dovrebbero cambiare modificando le variabili qs.

Ad esempio un utente potrebbe facilmente cambiare il parametro id in questo qs e vedere / modificare i dati che non dovrebbero http: // someurl? Id = 1


7
Se non controllo le autorizzazioni ho un diverso problema di sicurezza.
orip

ma la risposta è precisa: "maggio"
Seun Osewa,

1
La domanda non è se controllerai le autorizzazioni. È se il nuovo noleggio che non conosci controllerà le autorizzazioni.
Brian White,

@BrianWhite: ecco perché desideri avviare un processo di revisione del codice, in modo da poterli educare prima che raggiunga la produzione.
candu,

2
Ciò che facciamo è crittografare gli ID interi quando utilizzati nell'URL o nelle variabili del modulo.
Brian White,

6

Quando invii gli ID di database al tuo client sei costretto a controllare la sicurezza in entrambi i casi. Se mantieni gli ID nella tua sessione web puoi scegliere se vuoi / devi farlo, il che significa potenzialmente meno elaborazione.

Stai costantemente cercando di delegare le cose al tuo controllo di accesso;) Questo potrebbe essere il caso nella tua applicazione, ma non ho mai visto un sistema di back-end così coerente in tutta la mia carriera. La maggior parte di essi ha modelli di sicurezza progettati per un utilizzo non web e alcuni hanno avuto ruoli aggiuntivi aggiunti postumo, e alcuni di questi sono stati inseriti al di fuori del modello di sicurezza principale (poiché il ruolo è stato aggiunto in un diverso contesto operativo, ad esempio prima del web).

Quindi usiamo ID locali di sessioni sintetiche perché nascondono il più possibile.

C'è anche il problema dei campi chiave non interi, che può essere il caso di valori enumerati e simili. Puoi provare a disinfettare quei dati, ma è probabile che finirai come piccole tabelle drop bobby .


4
Interessante, anche se penso che il controllo di tutti gli input (inclusi i parametri URL) per ogni richiesta sia molto appropriato per il web.
orip
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.