Memorizza la password di accesso al database in classe const di PHP?

3

Ho un progetto PHP e ho bisogno di memorizzare le informazioni di accesso a MySQL.

Ho un file config.php all'esterno della directory pubblica e nel file che ho:

class Config
{
    const host = "dbserver";
    const name = "dbname";
    const user = "dbuser";
    const pass = "dbpass";
}

Quindi in init.php (anche al di fuori della directory pubblica) ho le funzioni di aiuto e altre cose:

include "config.php";
$db = MySQLWrapper(Config::host, Config::name, Config::user, Config::pass);
//... init sessions, spl_autoloads, class maps and other stuff

Ora nella directory pubblica www, ho index.php:

require_once "full path to init.php"
create page

È un design buono e sicuro? O c'è qualche problema con la classe const?

Non voglio usare direttamente variabili o array, perché se qualcuno accidentalmente autorizza log degli errori sul server, le password nelle variabili potrebbero perdere nel log degli errori tramite variabili debug print.

    
posta Martin Mickey 14.12.2018 - 10:30
fonte

2 risposte

0

Per me, la forma in cui sono archiviate le credenziali non è così importante come viene chiamata.

Il fatto di averli elencati direttamente nei parametri funzione / metodo li farà apparire nella normale traccia dello stack di PHP:

$db = MySQLWrapper(Config::host, Config::name, Config::user, Config::pass);

function MySQLWrapper($host, $name, $user, $password){
    new PDO("nonexistent", $user, $password);
}

rivelerà le credenziali nell'output

Fatal error: Uncaught PDOException: invalid data source name in /in/iLFHa:13 
Stack trace: 
#0 /in/GaEGR(13): PDO->__construct('nonexistent', 'dbuser', 'dbpass')
#1 /in/GaEGR(10): MySQLWrapper('dbserver', 'dbname', 'dbuser', 'dbpass')

Quindi per evitare che di solito suggerisco due cose:

  • per evitare che le variabili vengano visualizzate dal costruttore PDO, cattura l'eccezione e rilancia , quindi conterrebbe solo il messaggio ma non la traccia dello stack
  • per evitare che le variabili vengano visualizzate dai parametri funzione / metodo, inviale come variabile composta - un oggetto o un array.

Quindi, a prescindere dall'origine delle variabili, suggerirei di inviarli come array, non come variabili separate (è una cattiva pratica in generale, qui è un compromesso con la sicurezza) e catturare e ripetere l'errore di connessione PDO:

$db = MySQLWrapper([
    'host' => Config::host,
    'name' => Config::name,
    'user' => Config::user,
    'pass' => Config::pass,
]);

function MySQLWrapper($config) {
    try {
        new PDO("nonexistent", $config['user'], $config['pass']);
    } catch (\PDOException $e) {
        throw new \PDOException($e->getMessage(), (int)$e->getCode());
    }    
}

Ora è solo il messaggio di errore e un indizio dove è successo:

Fatal error: Uncaught PDOException: invalid data source name in /in/c9kpM:16 
Stack trace: 
#0 /in/c9kpM(10): MySQLWrapper(Array) 
#1 {main} thrown in /in/c9kpM on line 16
    
risposta data 14.12.2018 - 13:12
fonte
4

Il primo passo è quello di non memorizzare mai la password nel webroot. Lo hai già coperto. Buona!

Il secondo passo è quello di non memorizzare la password nel codice PHP. La tua base di codice dovrebbe essere priva di segreti, sia in costanti di classe o qualsiasi altra cosa. Questo ti consente di eseguire il controllo della versione, eseguire backup, condividerli, ecc., Senza pensarci due volte.

Mantenere i segreti fuori dal codice sorgente non è solo un bene per la sicurezza, ma anche una buona pratica di sviluppo del software. La tua fonte non dovrebbe dipendere dall'ambiente in cui è installata l'applicazione.

Quindi come risolvi questo? Prendi in considerazione l'utilizzo di una variabile di ambiente , un file di configurazione o php_value in httpd.conf . Per tutti questi casi dovrai pensare a quali processi ha accesso al valore e a come lo limiti.

    
risposta data 14.12.2018 - 11:07
fonte

Leggi altre domande sui tag