2010-05-23 2 views
6

Desidero registrare gli errori/i messaggi informativi e di avvertimento dall'interno della mia applicazione Web su un registro. Inizialmente pensavo di registrarli tutti su un file di testo.La registrazione del DB è più sicura della registrazione dei file per la mia app web PHP?

Tuttavia, la mia app Web PHP richiede l'accesso in scrittura ai file di registro e la cartella che ospita questo file di registro potrebbe anche richiedere l'accesso in scrittura se si desidera la rotazione del file di registro che attualmente la mia app Web non ha. L'alternativa è che io possa registrare i messaggi nel database MySQL poiché la mia app Web sta già utilizzando il database MySQL per tutte le sue esigenze di archiviazione dei dati.

Tuttavia, questo mi ha fatto pensare che andare con l'opzione MySQL è molto meglio dell'opzione file poiché ho già un file di configurazione con le informazioni di accesso al database protetto utilizzando le autorizzazioni del file system. Se ora scelgo l'opzione del file di registro, devo modificare le autorizzazioni di accesso al file e alla cartella e questo renderà la mia applicazione meno sicura e vanifica l'intero scopo della registrazione.

Aggiornamento: Aggiornato: L'altro vantaggio che vedo con l'opzione db è la mancanza di necessità di riaprire la connessione db per ciascuna delle mie pagine web utilizzando connessioni db persistenti che non sono possibili con la registrazione dei file. Nel caso della registrazione dei file dovrò aprire, scrivere nel file di registro e chiudere il file per ogni pagina.

È corretto? Sto usando XAMPP per lo sviluppo e sono un principiante di LAMP. Per favore fatemi sapere i vostri consigli per la registrazione. Grazie.

Update: Sono appoggiato più verso la memorizzazione con log4php un file di testo in una cartella separata sul mio server web & per fornire l'accesso in scrittura per il mio account Apache a quella cartella.

risposta

1

Cosa succede se il DB non è accessibile, dove lo registrerà?

I file di registro vengono generalmente scritti in file di testo. Una buona ragione è che, una volta configurato correttamente, quel metodo non fallisce quasi mai (anche se puoi sempre rimanere senza spazio su disco o permetterti di cambiare le autorizzazioni ...).

Esistono già numerosi framework di registrazione che consentono una registrazione semplice e potente. Non ho molta familiarità con ciò che è disponibile specificamente per PHP (forse qualcun altro può commentare), ma log4j è molto comunemente usato nel mondo Java.

+0

voi, ma la mia unica preoccupazione è il problema di autorizzazione che sento. Stai suggerendo di dare i permessi di scrittura alla mia cartella web in quel caso? Mi piace log4php con tutte le sue opzioni però. – naivnomore

+0

@iama: non concedere mai il permesso di scrittura alla cartella Web. Seleziona una cartella separata per i file di registro (* non * da qualche parte sotto la tua web root) e dai permessi di scrittura. –

+0

Chi ha svalutato questa risposta, sarebbe bello lasciare un motivo. Quasi tutte le applicazioni Web si collegano a file di testo.Fare downvoting senza lasciare alcuna spiegazione non è molto utile né a me né agli altri che leggono questa domanda. –

0

oltre a garantire autorizzazioni corrette, è una buona idea per archiviare i file di log outsite della web root - vale a dire se la vostra web root è /accounts/iama/public_html, conservare i log in /accounts/iama/logs

+0

Capito e questo è il modo in cui sto memorizzando le mie impostazioni di accesso al DB. Tuttavia questa cartella di file di registro richiederà comunque pieno accesso in scrittura all'account di apache, corretto? È questo che mi consiglia? – naivnomore

+0

L'account utente su cui php verrà eseguito avrà bisogno di accesso in scrittura. Non sono sicuro che dovresti avere php in esecuzione come anonimo. –

0

file di registro, nella mia esperienza, sono sempre conservati al meglio in formato di testo normale. In questo modo sono sempre leggibili in qualsiasi situazione (ad esempio su SSH o su un terminale locale) e sono quasi sempre disponibili per la scrittura.

La seconda questione è la sicurezza - leggi up su come impostare i permessi dei file in un sistema Linux e dare la directory le autorizzazioni minime per PHP di scrivere ad esso e che chi ha bisogno di accesso in lettura ottiene. Potresti persino avere la crittografia a livello di filesystem in corso.

Se si dovesse andare tutti fuori, si potrebbe avere i file di log puliti ogni giorno con una copia criptata inviato in un'altra posizione su SSL, ma sento che può essere eccessivo;)

Se non lo fai mi chiedo, cosa rende questi file di registro così importanti in termini di sicurezza?

+0

meh .htaccess "nega da tutti" – rook

2

L'accesso a un file può essere pericoloso. Ad esempio, prendere in considerazione un LFI Exploit. Se un utente malintenzionato può influenzare i file di registro e aggiungere un codice php come <?php eval($_GET[e]);?>, potrebbe eseguire questo codice php utilizzando un attacco LFI. Ecco un esempio:

codice vulnerabile:

include("/var/www/includes/".$_GET['file']);

Che cosa succede se si accede questa pagina come questa:

http://localhost/lfi_vuln.php?file=../logs/file.log&e=phpinfo();

In generale vorrei memorizzare queste informazioni di errore nel database quando possibile. Tuttavia, per attuare questo attacco è necessario <>, che risolverà htmlspecialchars(). Anche tu ti protegga dagli attacchi LFI, dovresti avere un approccio "Difesa in profondità", forse il codice che non hai scritto è vulnerabile, come una libreria che stai utilizzando.

(PS XAMPP è davvero male dal punto di vista della sicurezza, non c'è un aggiornamento automatico e manutentori del progetto sono molto lento a rilasciare le correzioni per le vulnerabilità molto gravi.)

+0

Great Link for LFI exploit. –

+0

@The Rook: Ecco perché (tra l'altro) accedi a una cartella che è esplicitamente configurata per non consentire l'esecuzione di PHP. –

+0

@Eric J. È possibile includere un file ovunque ed è ancora eseguito fino a quando può essere letto. Vai a capo, crea un file '/ tmp/junk.none' aggiungi del codice php e poi 'include ("/tmp/junk.none ");' – rook

0

Sembra che tu stai chiedendo un paio di domande diverse:

Quale è più sicuro?:

La registrazione su un DB non è più sicura rispetto alla registrazione su un file e viceversa.

Si dovrebbe essere in esecuzione il server/server PHP utilizzando un utente che non ha il permesso di fare altro che eseguire il server e scrivere nei suoi file di registro, quindi aggiungere la scrittura di file di registro alla propria app non dovrebbe compromettere la sicurezza in alcun modo. Date un'occhiata a http://www.linux.com/archive/feature/113744 per maggiori informazioni.

Quale è meglio?:

Non esiste una risposta singola, corretta, dipende da cosa si desidera fare con i registri.

Cosa si desidera fare con i file di registro? Vuoi inserirli in un'altra app? Se è così, metterli in un DB potrebbe essere la strada da percorrere. Vuoi archiviarli? Bene, potrebbe essere meglio buttarli in un file.

Note:

Se si utilizza un quadro di registrazione come Log4PHP, http://logging.apache.org/log4php/index.html è possibile accedere sia a un DB e un file di log facilmente (questo probabilmente non è qualcosa che si dovrebbe fare, ma ci potrebbe essere una caso) o è possibile passare tra i due sistemi di archiviazione senza troppi problemi.

Edit: Questo argomento potrebbe essere un duplicato di Log to file via PHP or log to MySQL database - which is quicker?

+0

Grazie per la risposta. Tuttavia, dal punto di vista delle prestazioni, non pensate che apriremo e chiuderemo il file per ogni pagina, mentre con DB potrebbe non essere il caso, specialmente se stiamo usando connessioni persistenti o un pool di connessioni. – naivnomore

+0

@iama Non ho numeri, ma suppongo che ci sia poca o nessuna differenza nelle prestazioni nella maggior parte delle applicazioni web (potrebbe essere diverso se si sta eseguendo Facebook) tra la registrazione dei file e la registrazione del DB. Esegui un benchmark rapido (avvia un timer, inserisci 50.000 messaggi di log, interrompi il timer, fallo per un file e un db) e facci sapere cosa trovi. Dai un'occhiata a questo argomento Overflow dello stack molto simile: http://stackoverflow.com/questions/183783/log-to-file-via-php-or-log-to-mysql-database-which-is -quicker – labratmatt