Quel redirect inutile

Sulla scia di questo post pubblicato qualche tempo fa e relativo ad un problema di sicurezza non molto avvertito degli script di upload in Apache oggi voglio parlarvi di un altro problema che spesso affiora, forse anche più subdolo del precedente.

Questa volta il problema riguarda come viene utilizzata la funzione header di PHP per effettuare i redirect e il funzionamento stesso del protocollo HTTP.

Supponiamo di avere questo scritto questo semplicissimo script:

if($GET['password'] != "parolasegreta"){
        header("Location: http://www.google.it");
}

echo "informazione segreta";


Come avrete certamente capito questo script controlla se il parametro password passato via GET è corrispondente ad una password che è stata inserita direttamente nel codice ( per rendere il tutto più semplice ). Se la password non coincide l’utente viene rediretto alla pagina di Google ( tanto per cambiare :-D ). Tutto ok quindi, la nostra preziosa informazione è salva da occhi indiscreti.

Provate con Firefox ad aprire il vostro script, verrete subito rediretti su Google!

Ma dove sta l’inghippo? Il problema sta nel fatto che Firefox ( o qualsiasi altro browser ) processa il contenuto degli header HTTP e quando trova un header Location agisce subito redirigento la vostra navigazione. Ma questo perchè Firefox è stato progettato per fare ciò! Cosa succederebbe se il nostro browser ignorasse l’header Location. Proviamolo subito.

Creiamo un piccolo script PERL che richiami il nostro file PHP e visualizzi il risultato. Eccolo qui:

use LWP;

$ua = LWP::UserAgent->new();
$ua->agent('Mozilla/5.0');

$req = HTTP::Request->new(GET => "http://localhost/redirect.php");

$res = $ua->simple_request($req);

print $res->as_string;

Ci aspettiamo che l’output corrisponda alla pagina HTML di google.it ma ecco cosa invece viene stampato:

HTTP/1.1 302 Found
Connection: close
Date: Fri, 10 Jul 2009 12:12:52 GMT
Location: http://www.google.it
Server: Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9
Content-Length: 20
Content-Type: text/html
Client-Date: Fri, 10 Jul 2009 12:12:52 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1
X-Pad: avoid browser bug
X-Powered-By: PHP/5.2.9

informazione segreta

Come come?!? La nostra preziosa informazione viene esposta nonostante non sia stata specificata nessuna password!

Perchè succede questo? Perchè semplicemente aggiungere un’intestazione non fermerà il motore PHP dal processare il resto dello script e quindi Apache spedirà il resto dell’output che verrà prodotto come se niente fosse.

Ecco invece un’alternativa sicura per la redirezione:

if($GET['password'] != "parolasegreta"){
        header("Location: http://www.google.it");
        exit();
}

echo "informazione segreta";

La funzione exit() garantisce lo stop del motore PHP che non procederà dunque oltre rendendo inarrivabile la nostra informazione a chi non conosca la password.

Scrivete sicuro!

Articoli correlati:

  1. Attenzione ai file con più estensioni in Apache!

Posted By Stefano Angaran

4 Responses to “Quel redirect inutile”

  1. Andrea Giacomin scrive:

    Tipico esempio di programmazione fatta con i piedi =D Sarebbe anche bastato un semplice else.

    Comuque bel post Ste ;)

  2. Stefano Angaran scrive:

    Chiaro, l’esempio è tanto per capirci.

  3. Marco Toigo scrive:

    Ottimo post, effetivamente come dice Andrea un semplice else sarebbe bastato, ottimo esempio per distinguere un buon programmatore da un pessimo programmatore….

  4. Stefano Angaran scrive:

    Bisogna anche dire che spesso non è così facile individuare il problema, soprattutto in grandi progetti ;-)

Leave a Reply




*
Get Adobe Flash playerPlugin by wpburn.com wordpress themes