Echo $feedback - numero 1
La rubrica che stampa a schermo i vostri consigli sul php
Benvenuti a
echo $feedback; la nuova rubrica di Topolinux dedicata al mondo del php.
Lo scopo di questa rubrica non sarà insegnare il php a chi vuole iniziare e nemmeno discutere le classiche quattro tecniche ultra-conosciute per generare pulsanti con le GD o per validare un indirizzo email.
Lo scopo vero di questa rubrica sarà quello di fornire uno spazio a noi, sviluppatori professionali di php, per scambiarci tecniche e soluzioni e per discutere assieme del nostro lavoro.
Ogni mese, infatti, raccoglieremo le soluzioni di chi vorrà scriverci, le discuteremo assieme, le analizzeremo e verificheremo la sicurezza e la stabilità del codice in maniera attenta e... anche un po' paranoica, in modo da permettere a tutti i nostri lettori di implementarle immediatamente nel loro lavoro.
Quindi mi raccomando: scrivetemi a [cod at fsfe punto org] !
Essendo questo il primo numero, inizierò io e inizierò con qualcosa di... anomalo: non parleremo di uno script ma delle mie 10 regole per scrivere codice stabile e sicuro.
Noterete che parlo sempre in prima persona: non pretendo certo che queste siano regole "assolute" (anzi molte sono banali) né di insegnare qualcosa a qualcuno!
Sono solo le mie regole, che condivido volentieri con voi in attesa che mi scriviate.
Le 10 regole del codice sicuro secondo CoD
- Impostare register_globals a off
Il php permette di richiamare le variabili passate con i metodi GET, POST e COOKIE direttamente con il loro nome invece che tramite gli speciali array superglobali $_GET, $_POST e $_COOKIE.
Questa funzione (chiamata register_globals) non dovrebbe mai essere abilitata.
Potrebbe capitare, infatti, che con register_globals abilitato un attaccante possa sostituire le variabili che usiamo nel nostro codice scrivendole direttamente nella barra degli indirizzi o meglio ancora tramite un POST accuratamente preparato.
Di solito questo è possibile se oltre a register globals abbiamo lasciato qualche altro "buco" aperto...
- I files inclusi devono avere sempre estensione php
Molti libri insegnano a dare ai files inclusi estensione "inc".
Per quanto sia bello poter distinguere velocemente quali files verranno inclusi e quali saranno invece richiamati direttamente, questa pratica permette l'esposizione del codice php all'utente finale.
Apache, infatti, esegue il parsing dei files in base alla loro estensione e spesso ci si dimentica di includere l'estensione "inc" nell'elenco dei files da interpretare come php.
Come risultato si ha un file in php (che magari contiene i parametri di configurazione del database mysql o altro) che se richiamato direttamente nella barra degli indirizzi del proprio browser viene fornito esattamente come risulta sul server, esponendo quindi il codice ad un possibile attaccante.
Per poter distinguere direttamente dal loro nome i files che includo, io uso un prefisso, come ad esempio: inc_mysql.php (io uso lib_ il perché lo capite nella prossima regola)
- includere sempre e solamente librerie di funzioni
Include è una funzione potentissima ma anche molto pericolosa. Ma è altrettanto pericoloso richiamare direttamente un file che normalmente viene incluso in un altro!
Immaginate ad esempio di avere una routine per la modifica della password e di includere la parte relativa al database mysql da un file esterno.
Che succederebbe se un utente malevolo richiamasse direttamente quel file? Magari passando le variabili via GET o POST? E se includessimo un file php che si occupa dell'upload? Cosa accadrebbe se il suo contenuto venisse eseguito come "stand-alone" e non incluso nella pagina corretta?
Per questo motivo io includo sempre files che contengono al loro interno SOLO ed ESCLUSIVAMENTE delle funzioni.
Richiamando direttamente un file che definisce solamente delle funzioni, infatti, non si otterrà niente e nessun codice verrà eseguito. Occorre anche ricordare che un file incluso deve terminare con ?> e con niente altro: ogni spazio dopo il carattere > verrà immediatamente inviato all'utente non appena il file verrà incluso, interferendo (se la usate) con la funzione header.