Security
Termini che devi imparare
- Data filtering
- register_globals
- SQL Injection
- Command injection
- safe_mode
Data Filtering
Data filtering, processo di validazione ed individuazione di dati Non Validi, è la base
fondamentale della sicurezza delle applicazioni Web. La premessa è semplice: non fidarti
mai di informazioni esterne, specie se arrivano da un client.
Come per i firewall anche per la sicurezza ci sono due modi precisi di approcciare le
informazioni che arrivano dall'esterno: la "whitelist" e la "blacklist". Con la prima, ipotizziamo
che le informazioni che ci arrivano non sono valide finchè non si prova il contrario. Con
la seconda, la blacklist, le informazioni sono valide finchè non si prova che invece non lo
sono. Ovviamente la più sicura è la prima.
Register Globals
In php 4.2.0, il valore di default di register_globals cambiò da On a Off. Programmatori
professionali non dovrebbero programmare con register_globals = On;
Quando abilitato, register_globals, importa dati da più fonti nel namespace globale.
Di particolare interesse per i programmatori sono $_POST, $_GET, $_SESSION e $_COOKIE.
Per esempio, se una POST request contiene l'indice 'foo', non viene creata solamente $_POST['foo']
ma anche $foo.
Anche se questo comportamento sia semplice e ben documentato, potrebbe portare a dannose
implicazioni. Un esempio comune è il seguente:
if(autorizzato()) {
$admin = true;
}
/* centinaia di righe più tardi */
if( $admin ) {
/* Attività particolari */
}
Un utente potrebbe settare questa variabile semplicemente chiamando la pagina con ?admin=1 appeso
all'url della pagina. Questo imposterà $admin ad 1 e validerà la if di prima.
SQL Injection
Quando farai una query al database, userai sicuramente dati forniti da un utente, esempio
lo username e la password. Il primo passo è quello di filtrare i dati. Usare dati
esterni per lavorare sul database, senza aver prima applicato un filtro, espone il sistema
a grossi rischi. Esempio:
$sql = "insert into foo values ('$bar');";
Finchè la variabile $bar non contiene apici singoli tutto va bene. Ma cosa succede se invece
è il contrario? Cosa succede se in $bar vi sono presenti caratteri di escape? MySql,
per esempio, disponde di una funzione chiamata mysql_escape_string() per fare un corretto escape.
Command Injection
Un'altra attività pericolosa è l'esecuzione di comandi da shell nel quale
ci sia bisogno dell'intervento di un utente. Mitigare questo rischio è molto simile
a quello del SQL Injection.
Ci sono due possibili problemi che puoi incontrare:
- Potrebbero esistere metacaratteri per l'esecuzione di comandi arbitrari
- Se le informazioni interessano un argomento del comando, allora possono esistere
metacaratteri che facciano interpretare l'argomento singolo come più di un argomento
Questi problemi possono essere superati con escapeshellcmd() e escapeshellarg(). La prima
funzione permette di annullare eventuali metacaratteri che permettano l'esecuzione di altri comandi.
La seconda funzione permette di usare in sicurezza l'argomento e che non venga diviso