[PILLOLE PHP] Gestire correttamente l’inclusione di files

In questa pillola tratteremo un argomento piuttosto semplice ma che se mal gestito può portare a dei grossi inconvenienti; l’argomento é l’inclusione di file.
Per quello che é la mia esperienza ho stabilito tre regole d’oro che dovrebbero bastare; se te ne vengono in mente altre sarò felice di discuterne.

1. Includere una sola volta

A meno che non sia strettamente necessario, é sempre meglio specificare che l’inclusione la vogliamo eseguire una sola volta utilizzando quindi i comandi include_once o require_once.
Facciamo un esempio per capire perché:
Il file 1.php contiene le definizioni di una serie di costanti.
I file 2.php e 3.php necessitano di alcune delle costanti definite in 1.php, dunque includeremo 1.php in entrambe i file.
Nella pagina page.php ci servono le funzioni contenute in 2.php e 3.php quindi li includeremo.
A questo punto se in 2.php e 3.php abbiamo incluso 1.php con il comando include, in page.php verrà sollevata una serie di errori di  livello notice, in quanto tentiamo di definire due volte le stesse costanti contenute in 1.php.
Utilizzando include_once risolviamo questi problemi. Utilizziamo dunque include e require solo quando é necessario ripetere più volte l’inclusione.

2. Percorsi assoluti

Se vogliamo includere dei file in un file che a sua volta sarà incluso, é importante farlo attraverso dei percorsi assoluti. Si prenda ad esempio la seguente struttura:

Ora, il file db_config.php conterrà i parametri di connessione al database e dovrà essere incluso nel file db_connect.php che a sua volta provvederà alla connessione.
Sarebbe tuttavia un errore includerlo in questo modo:

 include_once ‘db_config.php’;
 

Il file db_connect.php sarà infatti utilizzato in index.php, dunque dovremmo includere db_config.php in db_connect.php in questo modo:

 include_once ‘inc/db_config.php’;
 

Ma cosa succede se il file db_connect.php dovrà essere utilizzato anche da admin.php?
Un pasticcio.
Se vogliamo includere dei file in file che a loro volta verranno inclusi, lo dobbiamo fare tramite percorsi assoluti. Dunque includeremo db_config.php in db_connect.php in questo modo:

 include_once dirname(__FILE__) . ‘/db_config.php’;
 

La costante magica __FILE__ restituisce il percorso assoluto dove risiede fisicamente il file (diverso da $_SERVER[‘PHP_SELF’] che restituisce il percorso dove il file viene eseguito). Quindi con dirname() preleviamo unicamente il percorso.
A questo punto non abbiamo che da aggiungere il percorso del file che intendiamo includere; in questo caso si trova nella stessa cartelle quindi é molto semplice.
In questo modo, in qualunque punto andremo ad includere db_connect.php, il file db_config.php verrà incluso correttamente in quanto prelevato dalla sua posizione assoluta.

Nota: A partire da PHP 5.3 é stata introdotta la cosatante magica __DIR__ che equivale a

 dirname(__FILE__)
 

3. Prestare attenzione alle inclusioni dinamiche

Molta attenzione direi. Questo codice:

 include $_GET[‘page’];
 

senza nessun accorgimento equivale, dal punto di vista della sicurezza, ad un suicidio.
Per evitare ogni problema, ti rimando alla completissima guida sulla sicurezza scritta da Cristian, in particolare questo articolo, al capitolo indirezione.

Conlusione

Come vedi, anche per un semplicissimo argomento quale l’inclusione di file, c’é comunque parecchio da dire.

Tag: ,

L'autore

Maurizio è sposato con la triade PHP - MySql - Apache e, non pago, ha un'amante chiamata jQuery. Ha un blog dove cerca di descrivere nei minimi particolari sia la moglie che l'amante. La sua vera specialità è la realizzazione di gestionali complessi anche se non rifiuta mai un sito web. +

Sito web dell'autore | Altri articoli scritti da

Articoli correlati

Potresti essere interessato anche ai seguenti articoli:

18 commenti

Trackback e pingback

  1. Tweets that mention [PILLOLE PHP] Gestire correttamente l’inclusione di files | Your Inspiration Web -- Topsy.com
    [...] This post was mentioned on Twitter by Antonino Scarfì, Simone D'Amico. Simone D'Amico said: [PILLOLE PHP] Gestire correttamente l’inclusione…