display_errors
[Php.ini
, .htaccess
, apache2.conf
ed ogni script utente]
Contrariamente a quanto è opportuno usare in fase di programmazione, in sede di produzione, ossia a programma ultimato e consegnato al cliente, PHP dev'esser il più taciturno possibile, praticamente un muto.
Spetta sempre al programmatore ogni controllo e gestione dell'errore di runtime, ponendo ovviamente per assodato che errori di sintassi non ve ne siano, quindi per qualsiasi impostazione si abbia nel file php.ini
, l'utente non dovrebbe vedere mai alcun tipo di messaggio d'errore a video. Per questo usiamo:
display_errors = Off
display_startup_errors = Off
Stampare errori a video può significare rivelare la struttura interna del programma, vista come file e percorsi che vengono usati dagli script PHP, nonché la struttura del database sottostante.
Per i (pochi?) errori di runtime non previsti, nonché per ogni altra tipologia di errore o warning, è invece utilissimo affidarsi alla direttiva log_errors
, con la quale si andrà sempre a tener traccia degli errori (quelli specificati in error_reporting
), ma li si salverà in un file di log anziché inviarli al browser dell'utente, che come detto può risultare pericoloso nonché imbarazzante.
Ad esempio:
log_errors = On error_reporting = E_ALL & ~E_NOTICE log_errors_max_len = 4096 error_log = /var/log/php.err
Poniamo attenzione a che il file suddetto sia accessibile in lettura e scrittura dall'utente con cui gira PHP, meglio se l'utente ne è proprietario ed unico visualizzatore/scrittore.
Una riga di esempio del file:
[30-Sep-2006 06:36:20] PHP Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 4457872 bytes) in /var/www/xxx/yyy.lib.php on line 2427
Nel caso di questo errore, il programmatore (io...) non ha previsto un adeguato controllo, e l'applicazione si è "piantata". Ma per lo meno senza dare quest'orrido output all'utente.
register_globals
[Php.ini
, .htaccess
, apache2.conf
]
Tale direttiva, se abilitata, permette allo script PHP di creare variabili globali secondo quanto ricevuto via query string, form, cookies o sessione. Per evitare che uno script mal programmato interpreti variabili in GET o POST come variabili globali, con conseguente pericolo di modificare il suo comportamento interno, è bene disabilitare questa voce, sempre e comunque.
Nel caso il programma Web non funzionasse, modificare il programma non la direttiva, e non fidarsi dello stesso, già ha sfigurato.
magic_quotes_gpc
[Php.ini
, .htaccess
, apache2.conf
]
Tale direttiva equivale ad un addslashes automatico sui caratteri considerati "pericolosi" relativi a tutte le stringhe passate via GET e POST e su tutto quanto salvato nei cookies (gpc = GET POST cookies). La sua abilitazione o disabilitazione dipende dalla logica di programmazione: si veda la già citata guida per maggiori informazioni.
Nel dubbio abilitare la direttiva.
In luogo dei magic_quotes
o dell'addslashes
"manuale" per fare l'escape dei caratteri riservati è preferibile tuttavia utilizzare le funzioni apposite che PHP mette a disposizione. Nell'interazione con MySQL ad esempio è opportuno usare mysql_real_escape_string
sulle variabili passate alle interrogazioni SQL.
allow_url_fopen
[Php.ini
, apache2.conf
]
Abilita i wrapper URL per fopen()
, in modo da poter accedere agli oggetti URL (http://, ftp://) come semplici file locali. Nel caso l'applicazione Web non utilizzi la funzione fopen()
o include()
per accedere ad URL remoti, disabilitare la direttiva. In tale maniera è possibile scongiurare possibili exploit dovuti ad include dinamici remoti malevoli.
enable_dl
[Php.ini
, apache2.conf
]
La funzione dl()
permette di caricare moduli aggiuntivi nel sistema, runtime, da script. In tal modo potrebbe esser caricato un modulo che modifichi il comportamento di Apache stesso, portando a superare le direttive del php.ini
.
Si consiglia di usare quindi:
enable_dl = Off
in modo che gli unici moduli caricati siano quelli indicati in configurazione.