A dispetto dalla sua robustezza sotto questo profilo, il PHP rimane però uno dei linguaggi maggiormente sfruttati oggi da hacker, virus e malware writer per attaccare i server che lo supportano.
Quello che segue è un elenco delle funzioni più comuni del linguaggio, seguite da una breve descrizione e dal tipo di parametro che è consigliato specificare (on per attivare la funzionalità ed off per disattivarla):
- register_globals: consente agli utenti di indicare variabili e valori iniettandoli nel contesto del programma con il rischio di alterarne la logica (ad esempio far credere ad un’applicazione di essere un utente autenticato quando invece non lo è). E’ consigliato impostare questa opzione ad OFF.
- magic_quotes: è un processo che automaticamente effettua l’escaping (ovvero la messa in sicurezza) dei dati acquisiti in ingresso dagli script PHP. Pur l’apparente utilità di questa feature è consigliato effettuare un controllo dei dati a runtime impostandola quindi ad OFF.
- allow_url_fopen: questa opzione consente di accedere a file remoti attraverso i protocolli ftp o http. Per ragioni di sicurezza (vulnerabilità di tipo File Inclusion) è consigliato impostare quest’opzione ad OFF.
- safe_mode: abilita la modalità sicura del PHP. E’ consigliato impostare questa opzione ad ON. Essa fornisce accesso ad una serie di sotto opzioni. Con safe_mode_include_dir è ad esempio possibile specificare una o più directory in cui risiedono file di tipo include, mentre con safe_mode_exec_dir è possibile indicare dove sono localizzati gli eventuali file eseguibili richiamati dall’applicazione PHP. Tutti i file all’esterno di queste directory non potranno essere acceduti.
- safe_mode_gid: effettua una comparazione sul group id (GID) prima di accedere ad un file. E’ consigliato attivare questa opzione impostandola ad ON.
- open_basedir: limita i file che possono essere acceduti dagli script PHP ad una o più directory specifiche. E’ consigliato utilizzare questa opzione.
- session.auto_start: specifica se le sessioni sono avviate automaticamente o richiedono una fase di startup. Per motivi di sicurezza e praticità è consigliato disattivare questa opzione impostandola ad OFF.
- session.entropy_file: indica il percorso di una risorsa che può essere utilizzata come ulteriore fonte di entropia per il processo di generazione degli identificativi di sessione. E’ consigliato impostare questa opzione al file speciale “/dev/urandom”.
- session.cookie_secure: specifica se i cookie di sessione devono essere inviati solamente attraverso canali di comunicazione sicuri. E’ consigliato attivare questa opzione impostandola ad ON.
- session.cookie_httponly: preclude l’accesso al cookie di sessione da parte di javascript o altri linguaggi client-side. Per ragione di sicurezza è consigliato impostare questa opzione ad ON.
- display_errors: determina se gli eventuali errori generati dagli script PHP devono essere riportati all’utente nella pagina web richiesta. Per questioni di sicurezza (Information Leak) è consigliato disattivare questa opzione (OFF).
- expose_php: è consigliato disattivare questa opzione impostandola ad OFF. In questo modo si riduce le possibilità che il sistema possa essere individuato come web server vulnerabile da scansioni automatizzate degli header HTTP.
Alcuni consigli per sviluppare applicazioni sicure nel linguaggio PHP
Il PHP è un linguaggio interpretato ampiamente utilizzato per la creazione di script dinamici. Nato da un’idea di Rasmus Lerdorf nel 1994, è divenuto uno standard de facto per lo sviluppo di applicazioni web. Il PHP è considerato un linguaggio comunemente sicuro, ma nonostante questo è allo stesso tempo uno dei più sfruttato da hacker, virus e malware writer per diffondere software malevolo.
Gran parte delle vulnerabilità software è oggigiorno riconducibile allo scarso filtraggio dell’input utente.
Il presupposto comune è che i dati acquisiti in ingresso sono sempre consistenti e frutto di richieste provenienti da utenti autorizzati. Niente di più sbagliato! Nessuna variabile dovrebbe essere considerata costituita da dati la cui regolarità non può essere comprovata. Ciò si riduce a dire che tutto l’input utente deve sempre essere controllato/filtrato per accertare che sia conforme con il tipo, le logiche e le operazioni che su di esso l’applicazione deve svolgere. In particolare devono essere previste i seguenti accorgimenti:
• Tutti i caratteri che possono avere una qualche valenza per l’interprete dei comandi (! $ ^ & * ( ) ~ [ ] \ | { } ‘ ” ; < > ? – `) o l’helper SQL (# ? % ‘ “ — ;) devono essere filtrati. Poiché alcuni di questi caratteri sono anche utilizzati per rappresentare tag HTML validi è importante prescindere dal tipo di dato che si sta acquisendo in input prima di operare un adeguato filtraggio;
• Altri caratteri che potrebbero creare problemi, troncamenti o effetti indesiderati durante l’accesso a file o risorse DB sono il terminatore stringa (\0), il ritorno a carrello (\x10), la nuova riga (\x13) ed ASCII 26 (\x1a). Questi vanno opportunamente gestiti.
- La quantità di input che l’utente può inviare in una form deve essere sempre dimensionato in modo da non eccedere i limiti della direttiva memory_limit impostata nel file di configurazione del PHP (valore di default 8 MB);
- I nomi dei file hanno solitamente una dimensione limitata a 255 byte. Quando si progetta un’applicazione PHP che accede sul disco è sempre bene considerare questo elemento. Eventuali loro troncamenti dovuti ad un poco accorto dimensionamento dell’input utente potrebbe generare effetti disastrosi o inaspettati;
- Ogni script che invia e-mail verso l’esterno può essere potenzialmente abusato così come gli hidden field di una form. Bisogna sempre accertare i permessi assegnati all’utente prima di decidere se eseguire un’operazione;
- Tutte le variabili dichiarate nell’applicazione devono essere inizializzate;
- E’ consigliato offuscare tutte le pagine PHP dell’applicazione;
- I valori utilizzati con la funzione header() devono essere privati dei caratteri speciali “\r” (\x0a) ed “\n” (\x0c);
- I file inclusi nel codice PHP devono avere estensioni riconosciute dal web server come codice interpretabile e non come text/plain visualizzabile.
VIA: Valerio Guaglianone