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
Codice PHP:


if($_POST['nick'])
    
    if(
getPassWordFromDB(
               
$_POST['nick'],
               
$_POST['pass'])
         )
        
$auth=1;
    else
        
$auth=0;
    
if(
$auth==1)
        echo(
'UTENTE IDENTIFICATO'); 
la funzione getPassWordFromDB sarà una funzione che valida e cripta l'input del nick e della pass e restituira true
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("<","&lt;",$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:

Codice PHP:
..
$validUsermysql_query("Select id from
 autentificazioneUtenti 
where nomeUtente= 
{$_POST[nome]} and parolaChiave= {$_POST[passwd]}");
.. 
inutile dire che anche qui c'e' un serio problema di sicurezza, si puo' risolvere in diversi modi :

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..