Filtrare gli input in modo sicuro

Filtrare gli input in modo sicuro

PHP, è divenuto oramai uno dei linguaggi di scripting più utilizzati sul web. Grazie anche a progetti open source divenuti ormai famosissimi quali WordPress, Joomla, Drupal molti anche tra i non addetti ai lavori si ritrovano a navigare migliaia di righe di codice in scritte in questo linguaggio creato ormai 20 anni fa.

Una conoscenza di base di questo potente linguaggio ormai è un obbiettivo alla portata di molti tuttavia proprio a causa della grande versatilità e delle tante possibilità che questo strumento offre è molto facile incorrere in errori di scrittura che possono rendere il codice molto pericoloso.

Alcuni dei problemi rilevati su progetti Php che sono on line si hanno quando non si riesce correttamente a filtrare gli input e di conseguenza gestire opportunamente eventuali uscite controllate.

 Perchè filtrare gli input è importante?

Non gestire correttamente gli input, vuol dire esporre il web server ai dati che vengono inseriti da “utenti” esterni. Il problema è che molto spesso gli utenti esterni non sono semplicemente persone che hanno sbagliato a digitare un nome e cognome, ma sempre più di frequente si tratta di strumenti automatici ed i dati inseriti sono altri pezzi di codice che possono fare prendere ad estranei il possesso della macchina su cui il nostro codice è inserito.

Non sono rari i casi in cui poi, le macchine “bucate” vengono utilizzate per invio di Spam.

Vediamo qualche situazione.

Supponiamo di aver realizzato un nostro piccolo CMS.
Una soluzione abbastanza semplice per visualizzare un contenuto diverso a secondo del parametro page passato dalla riga del browser è la seguente :

$page = $_GET['page'];
readfile(__DIR__.'/header.html');
echo file_get_contents('/var/www/miosito/content/'.$page);
readfile(__DIR__.'/footer.html');

e l’Url da passare nel browser sarebbe la seguente :

http://miosito.it/index.php?page=about.html

Il funzionamento è semplice, viene recuperato il contenuto da visualizzare dalla variabile $page, viene visualizzato il contenuto di header.html, il nostro contenuto e poi il footer.html

cosa succede ad esempio se l’Url passata è la seguente :

http://example.com/index.php?../../../../home/yourname/.ssh/id_rsa

Probabilmente se il server non è gestito da sprovveduti in questo caso nulla, ma in generale passando questa riga come Url verrà stampata a video la chiave pubblica SSH del nostro server.

Senza pretendere di avere i dati sulla macchina server, allo stesso modo si può ad esempio stampare a video semplicemente il file di configurazione del nostro sito che sicuramente sarà meno protetto e più accessibile dei file di configurazione della macchina.

Probabilmente un semplice controllo sulla variabile $page in questo caso renderebbe il codice più sicuro.

Come rendere il codice sicuro?
I controlli che si possono fare sono diversi.
Ad esempio si posso sfruttare i filtri ed i validatori presenti in Php (built-in filters and validators).

Prima dell’introduzione dei filtri di PHP la validazione degli URL era affidata alle espressioni regolari, con tutte le limitazioni del caso. Fortunatamente oggi possiamo utilizzare questi filtri con efficacia.

$url = 'http://esempio.com';
$validation = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED);
if ( $validation ) {
	// è un URL valido
} else {
	// non è un URL valido
}

Con il metodo filter_list() non otteniamo che una lista di tutte le variabili di cui esiste un filtro apposito e il loro relativo ID con filter_id(). Se vogliamo validare uno specifico dato, allora possiamo usare la funzione fiter_var()

foreach(filter_list() as $id => $filter)
{
	echo '<p> Filter Name: ' . $filter . '
Filter ID: ' .	filter_id($filter) . '</p><hr />';
}
$input = 123456;
 
echo filter_var($input, FILTER_VALIDATE_INT);
 
$input2 = 1.2;
 
echo filter_var($input2, FILTER_VALIDATE_INT);

Altre accortezze
Gestione dei file caricati anche commercio ingannevole:

  • Se si caricano dei file esterni al nostro codice php prestare molta attenzione anche nel caso di script commerciali
  • Assicurarsi che il server web non permetta dieseguire file PHP caricati (su Apache basta verificare che la variabile di configurazione php_flag engine sia a off)
  • Se abbiamo dei caricamenti di immagini, utilizziamo getimagesize() per controllare le dimensioni dell’immagine (e se è in realtà un’immagine) prima di tentare di aprirla. Se l’immagine è troppo grande (dimensioni in pixel), PHP può facilmente andare oltre il limite di memoria, e lo script andrà in crash.
  • Se è possibile, usare strumenti quali Amazon S3 (o equivalente) per lo storage di file esterni.Avremo meno fastidi di gestione dei file di grandi dimensioni e di sicurezza sul proprio web server

[Rif http://gabrieleromanato.com/2012/04/php-validazione-degli-url-con-i-filtri
[Rif. https://www.inanimatt.com/php-input-filtering.html]
[Rif. http://it.wikipedia.org/wiki/PHP]



About Mauro De Filippis 711 Articles
Laureato in Ingegneria Informatica nel 2008 presso l'Università degli Studi di Lecce con una tesi in Processi di Produzione Robotizzati dal titolo "Integrazione delle tecniche di progettazione del ciclo di lavorazione con programmazione della produzione”. Le mie attività principali sono : sviluppo di applicativi ANSI C per terminali POS basati su processori ARM Risc 32Bit con 2-4 MB di Ram (progettazione, sviluppo e test delle applicazioni ) sviluppo in ambiente .NET sviluppo Web in ambiente PHP, ASP Installazione, progettazione, utilizzo di Db MS SQL Server, Mysql, Acces , Oracle Da anni mi occupo di CMS Open Source, in particolare di Joomla e Wordpress. Mia è la Guida Wordpress 3.5, la Guida Joomla 2.5 , il Corso online Joomla! 2.5 ed il Corso online Wordpress Mi occupo anche di LMS in particolare di Moodle e Docebo. Google+ by Mauro De Filippis

Be the first to comment

Rispondi