Devo limitare l'accesso al nome utente e alle password in un'app Web?

8

Sto iniziando a scrivere la mia prima applicazione web seria e sto pensando a come memorizzare le informazioni su nome utente e password. Ci sono molti articoli che descrivono dettagliatamente come l'archiviazione delle password in testo semplice sia una pessima idea e che le password crittografate salate siano la soluzione giusta. Tuttavia, posso trovare molto poco sulla limitazione dell'accesso ai dati dell'utente stesso.

Sto pensando a una situazione in cui la mia app Web è compromessa e un utente malintenzionato può leggere qualsiasi informazione dal mio database. Anche se memorizzo i nomi utente con password crittografate, l'utente malintenzionato sarebbe in grado di rimuovere tutti i nomi utente dal database (ma almeno non otterrebbero le password). Tuttavia, potrei limitare l'accesso così anche la mia app non ha avuto accesso a questi dati. Stavo pensando di impedire al mio utente del database di visualizzare la tabella con nomi utente e password. È quindi possibile fornire l'accesso tramite una stored procedure che accetta nome utente e password, restituendo true se viene trovato un nome utente con la password o presentando una vista di nomi utente e password hash, quindi, anche se compromessi, i nomi utente reali non possono essere trovati .

Dato che sono nuovo a questo, e non ho trovato nessun articolo che consigli qualcosa di simile, suppongo che mi sia sfuggito qualcosa di semplice che rende insicure le idee di cui sopra.

Grazie.

    
posta 21.06.2011 - 01:43
fonte

3 risposte

9

Da un punto di vista della sicurezza, la minaccia è ciò che accade quando la memoria sottostante è esposta in in qualsiasi modo , non solo in una dichiarazione diselect * from users;% iniettata in sql. Ti fidi dei tuoi amministratori? Anche quello che hai dovuto lasciar andare? Chi altro ha accesso alla scatola? È una macchina virtuale in un'azienda di terze parti? Nel cloud? Questo è il motivo per cui l'hash giusto viene spesso sottolineato in primo luogo, in modo che le password degli utenti abbiano una certa difesa anche nei confronti di un utente autorizzato.

Detto questo, penso che controllare l'accesso tramite le viste sarebbe vantaggioso, in modo che tu possa solo eseguire pseudo-istruzioni "inserisci utente", "cancella utente", "l'utente esiste" e "queste credenziali sono valide" dal punto di vista della tua app Web. Ciò impedisce l'enumerazione, tranne che per le chiamate ripetute al database con un identificatore utente conosciuto, che è meglio che consentire all'utente malintenzionato di accedere all'intero database. Stai riducendo la facilità con cui un utente malintenzionato può accedere a tale tabella in caso di potenziale compromissione / vulnerabilità imprevista nel codice o nel framework. L'unica domanda è la compatibilità con i framework esistenti, anche se molti offrono la possibilità di estendere o implementare back-end di autenticazione personalizzati.

Per quanto riguarda l'hashing, utilizza PBKDF2 o bcrypt o una funzione di derivazione della chiave hash lento equivalente con sale, non solo un hash con sale. Un articolo decente sull'argomento spiegherà questa fase (a volte raccomandano di ripetere un hash per diverse migliaia di iterazioni, è essenzialmente la stessa idea).

    
risposta data 21.06.2011 - 02:08
fonte
6

Posso essere irriverente e azzardare i voti dicendo di no?

Il modo migliore per evitare che i tuoi nomi utente e password vengano violati. Non archiviarli in primo luogo.

Utilizza un'autenticazione federata come Facebook Connect (oAuth) o Google Open-ID. Scrivo di più sui vantaggi qui .

    
risposta data 21.06.2011 - 15:09
fonte
2

Dai un'occhiata a Devise . Assiste molto con la gestione degli utenti.

Anche Railscast di Ryan Bates:

Introduzione a Devise

Personalizzazione del dispositivo

    
risposta data 21.06.2011 - 01:53
fonte

Leggi altre domande sui tag