2009-06-13 4 views
5

Lettore prima volta, poster prima volta (woo!)Rischio di sicurezza nella memorizzazione delle informazioni di accesso SQL nel codice PHP?

Quindi ho implementato i miei script di accesso per un sito Web informale. Non è probabile che sia compromesso, ma per sicurezza, vorrei chiedere se c'è il rischio per la sicurezza di avere il mio login al database MySQL memorizzato in chiaro nel codice php.

Per quanto ne so, il codice stesso viene analizzato da Apache, quindi l'utente finale non lo vede (solo l'output), il che significherebbe che dovrebbe essere sicuro da mantenere ... ma io come una seconda opinione.

Riepilogo: Accesso al database tramite mysql_connect, mysql_select_db, mysql_query. Informazioni di accesso memorizzate in variabili locali definite ad ogni iterazione dello script e (penso) scaricate una volta terminato lo script.

Vulnerabilità di sicurezza?

risposta

10

Si potrebbe anche considerare di spostare la combinazione nome utente/password in un file di configurazione separato che vive al di fuori della radice del web. Assicurati che il luogo non sia direttamente accessibile dal lato del web server.

In questo modo, se per qualche motivo il server Web decide di non eseguire più file PHP, non si perdono le informazioni dell'account sul server del database.

Come bonus aggiuntivo, se si utilizza qualcosa che faccia una copia del file .php (editor, SVN o qualsiasi altra cosa) nel webroot, non si rischia che nessuno possa aggirare l'esecuzione .php.

+6

Verità. Quando ho iniziato a usare Linux, non ho notato che Gedit ha creato filename.ext ~ e quando ho caricato la cartella, i ~ file sarebbero andati con esso. Poi potrei andare su mysite.com/index.php~ e lì era in chiaro – sqram

+2

@lyrae: Io ... buon signore, grazie per averlo indicato. Non avevo idea ... O.o * corre e cancella * –

+0

Se devi assolutamente avere la password nel file PHP, allora atleast sha1 o md5 esso. – Shoan

0

Chiunque possa accedere con i privilegi di root su quel server web (o anche in qualche modo più in basso) sarà in grado di vedere la propria password - ma poi, è praticamente impossibile difendersi dal super-utente (in qualsiasi altro luogo si potrebbe mantieni la tua password, potrebbero hackerare e trovarla). Oltre a questo rischio, dovresti essere al sicuro.

Modifica: è possibile utilizzare anche i backup del server (se non crittografati o da qualcuno in grado di decrittografarli) per recuperare la password se è in chiaro nello script .php. Questo possibile attacco potrebbe essere mitigato (con grandi inconvenienti/costi) mantenendo la password in un luogo diverso e sicuro e inviandola (in modo sicuro) solo in circostanze altamente restrittive. È questo il tipo di attacco che temi?

7

Questa è una procedura molto standard per le applicazioni Web che comunicano con un database.

Si consiglia di prelevare le autorizzazioni di lettura dal file per gli utenti diversi dal server Web e da soli: se altri utenti sono presenti nella casella che possono spiare il file, potranno accedere al server mysql.

Inoltre, è necessario regolare l'autorizzazione dell'eseguibile nella directory principale in quanto impedirà l'accesso anche a utenti non autorizzati.

Indurire l'host consentito dell'utente mysql, in modo che solo le caselle necessarie siano in grado di connettersi ad esso.

Ovviamente se la tua casella è compromessa e un utente malintenzionato ottiene l'accesso come root, c'è ben poco che ti protegga.

+2

+1 - Sarebbe anche una buona idea assicurarsi che l'utente MySql non disponga di privilegi quali drop/grant ecc. – karim79

1

È possibile aggiungere un ulteriore livello di sicurezza inserendo tutti i file php (tranne index.php ovviamente) in una directory separata e proteggerli con un file .htaccess. Questo copre i casi in cui il parser php non viene richiamato e apache restituisce i file in chiaro. Un'altra cosa che potrebbe essere utile: <?php defined('some_id_here') or die(); ?>. Puoi metterlo in cima ad ogni file php tranne index.php (dove definite some_id_qui) quindi non esiste un accesso diretto ai vostri file di database.

+0

Qualcuno ha mai visto un'istanza di Apache configurata correttamente NON sta invocando il parser PHP. –

+0

OK hai ragione. Intendo dire che cose ipotetiche come questa ovviamente non succedono MAI nella vita reale, ma ho pensato che fosse degno di nota. Quindi una ricerca su google come "echo filetype: php" non rivela nulla E non trovo nulla di simile a questo http://tppserver.mit.edu/index.php3 che mi porta a http://tppserver.mit.edu/tpp_www .inc: o) haha ​​ – merkuro

+0

Credo che sia successo a Facebook nel recente passato. http://www.phpdeveloper.org/news/8433 – Shoan

1

Non avere la maggior parte del codice all'interno del webroot, dove è possibile, per quanto improbabile, è solo la prima linea di difesa che può essere presa.

Il database deve essere protetto anche se l'utente e la password del database sono stati pubblicati, con il semplice espediente di consentire comunque a un numero limitato di computer di origine di connettersi comunque al database.

difesa in profondità

<?php // simplest /index.php, as the only .PHP file in the public-accessible webroot 
require '../bootstrap.php'; 
+0

Funziona solo se il tuo webhost non è cretino e ti costringe a mettere tutto fuori allo scoperto. – jmucchiello

+2

... e quindi solo se dai il tuo denaro a una società di webhosting. –

1

Non so come ci si collega al database MySQL, ma se si utilizza DOP v'è la possibilità che il costruttore DOP genera un'eccezione. Se non rilevi questa eccezione, il motore di Zend mostrerà un backtrace di default e rivelerà i dettagli della tua connessione!

È normale memorizzare le credenziali di connessione all'interno di un file php/variabile o, in tal caso, utilizzare PDO, nel DSN (Nome origine dati). Ti suggerirei persino di inserirlo in un file php, perché verrà analizzato e non inviato in chiaro nel web ...

Un passo verso una maggiore sicurezza consiste nel mettere i dettagli di accesso all'esterno di www-root o proteggere con un file .htaccess (ciò renderebbe impossibile l'accesso al file tramite il server web).

Tuttavia sul mio server è impossibile collegare non da localhost. Quindi non mi interessa se qualcuno legge i miei dati di accesso (non è il caso, ovviamente).

+0

Buon punto. Dovrei configurare il mio database per accettare solo connessioni locali, poiché è esattamente come ho impostato il mio. Saluti! –