Regola numero 1: Input is Evil
Scrivo questa pillola, sperando che chiunque apporti un contributo significativo,
lo scopo sarà elencare le peggiori abitudini dei programmatori (PHP ma non solo)
elencando per ogni ERRORE CLASSICO o infimo la via corretta, cercando di spiegare
di volta in volta il perchè non si debba agire nel modo sconsigliato;
1)Register_Globals
Partiamo col considerare una peculiarità di PHP , ovvero register_globals
questa opzione del file php.ini DEVE ESSERE SETTATA SEMPRE A OFF,
questa opzione permette a php di prendere ogni variabile passata tramite get o post
e trattarla come una variabile globale,
un opzione che potrebbe sembrar utile, ma che ha un piccolo svantaggio
chiunque puo' alterare qualsiasi variabile ,anche solo aggiungendo un parametro al get
se il registro fosse a ON anche un possibile "codice sicuro" come il seguente potrebbe venir bucato:
page.php
la funzione getPassWordFromDB sarà una funzione che valida e cripta l'input del nick e della pass e restituira trueCodice PHP:
if($_POST['nick'])
if(getPassWordFromDB(
$_POST['nick'],
$_POST['pass'])
)
$auth=1;
else
$auth=0;
if($auth==1)
echo('UTENTE IDENTIFICATO');
se nel db i dati corrispondono (ipotizziamo che questa funzione sia sicura al 100%)
in caso di register_global = off lo script sopra non causa problemi..
ma se settato a ON chiunque immettendo page.php?auth=1 vedrebbe la scritta UTENTE IDENTIFICATO.
(per provarlo basta sostituire if(getPassWordFromDB()) con if(false))
Quindi andate nel php.ini e impostate
register_globals = Off
e riscrivete i vostri script che si basavano su questo sistema utilizzando opportunamente
$_GET $_POST $_REQUEST $_COOKIE e $_SESSION
2)Validazione lato client & Code Injection
in molti effettuano dei controlli tramite JS per validare un input
e assicurarsi che l'input non sia potenzialmente dannoso,
ebbene le funzioni Js sono buone per evitare che per un errore di digitazione
si debba ricaricare una pagina,
bisogna sempre pero' controllare la validità dell' input lato Server, poiche'
chiunque potrebbe semplicemente disabilitando Js nel proprio Browser immettere qualsiasi codice dannoso
(per evitare il code injection si consiglia di effettuare sempre un str_replace("<","<",$input);
3)Variabili miste a SQL
una brutta abitudine abitudine e' quella di creare Query mescolando variabili provenienti da un input esterno
direttamente nelle stringhe di query:
inutile dire che anche qui c'e' un serio problema di sicurezza, si puo' risolvere in diversi modi :Codice PHP:
..
$validUser= mysql_query("Select id from
autentificazioneUtenti
where nomeUtente= {$_POST[nome]} and parolaChiave= {$_POST[passwd]}");
..
controllando la pagina che invia i dati( controllo semplice ma che non elimina del tutto i problemi )
utilizzando le funzioni htmlspecialchars() mysql_real_escape_string()[o funzioni simili relative al db in uso] nl2br() ,
un altro modo e' quello di usare Query parametrizzate tramite librerie scritte ad hoc.
4)MAI GET SENSIBILI (si offendono)
un errore che mi capita a volte di vedere, ma che mi fà rabbrividire e' quello di passare in GET dati sensibili
esempio
main.php?id=123&perm1=0&perm2=0
se a quel id corrisponde un utente, e io cambiassi la querystring otterrei facilmente privilegi amministrativi..
in ogni caso mai passare dati sensibili in GET o in POST utilizzare a questo scopo solo ed esclusivamente le Session.
5)MAI FIDARSI DEGLI INPUT
la regola basilare per evitare la maggiorparte degli errori e' mai fidarsi di qualsiasi input quindi prendete le giuste precauzioni
quando lavorate con $_GET $_POST $_COOKIES e anche prestate attenzione anche a cosa tirate su dal db..