Come posso evitare di avere la password del database memorizzata in testo normale nel codice sorgente?

StackOverflow https://stackoverflow.com/questions/42833

Domanda

Nell'applicazione web che sto sviluppando attualmente utilizzo una soluzione ingenua quando mi connetto al database:

Connection c = DriverManager.getConnection("url", "username", "password");

Questo è piuttosto pericoloso.Se un utente malintenzionato riesce ad accedere al codice sorgente, ottiene anche l'accesso al database stesso.Come può la mia applicazione web connettersi al database senza memorizzare la password del database in testo normale nel codice sorgente?

È stato utile?

Soluzione

È possibile archiviare la stringa di connessione nel file Web.config o App.config e crittografare la sezione che la contiene.Ecco un ottimo articolo che ho utilizzato in un progetto precedente per crittografare la stringa di connessione:

http://www.ondotnet.com/pub/a/dotnet/2005/02/15/encryptingconnstring.html

Altri suggerimenti

In .NET la convenzione prevede di archiviare le stringhe di connessione in un file di configurazione separato.

Quindi, il il file di configurazione può essere crittografato.

Se si utilizza Microsoft SQL Server, tutto ciò diventa irrilevante se si utilizza un account di dominio per eseguire l'applicazione, che quindi utilizza una connessione attendibile al database.In questo caso la stringa di connessione non conterrà nomi utente e password.

Posso consigliare queste tecniche per i programmatori .NET:

  • Crittografa password\stringa di connessione nel file di configurazione
  • Configura una connessione affidabile tra client e server (ad es.utilizzare l'autenticazione di Windows, ecc.)

Ecco alcuni articoli utili di CodeProject:

A meno che non mi sfugga il punto, la connessione dovrebbe essere gestita dal server tramite un pool di connessioni, quindi le credenziali di connessione sono conservate dal server e non dall'app.

Andando oltre, generalmente creo una convenzione in cui l'applicazione web frontend (in una DMZ) comunica con il DB solo tramite un servizio web (nel dominio), fornendo quindi una separazione completa e una maggiore sicurezza del DB.

Inoltre, non concedere mai privilegi all'account db oltre a quelli essenzialmente necessari.

Un approccio alternativo consiste nell'eseguire tutte le operazioni tramite procedure memorizzate e concedere all'utente dell'applicazione l'accesso solo a queste procedure.

Supponendo che tu stia utilizzando MS SQL, puoi sfruttare l'autenticazione di Windows che non richiede nome utente/passaggio in nessuna parte del codice sorgente.Altrimenti dovrei essere d'accordo con gli altri utenti che consigliano app.config + crittografia.

  1. Crea un utente del sistema operativo
  2. Inserisci la password in una variabile di ambiente del sistema operativo per quell'utente
  3. Esegui il programma come quell'utente

Vantaggi:

  1. Solo root o quell'utente può visualizzare le variabili di ambiente del sistema operativo di quell'utente
  2. Sopravvive al riavvio
  3. Non controlli mai accidentalmente la password nel controllo del codice sorgente
  4. Non devi preoccuparti di rovinare i permessi dei file
  5. Non devi preoccuparti di dove archivi una chiave di crittografia
  6. Funziona con la piattaforma x
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top