Come proteggersi dalla deturpazione di un sito

Spesso questi attacchi sono più imbrazzanti che dannosi perchè danno a chi attacca la possibilità di sfigurare il sito inserendo magari una pagina del suo.Se un sito è progettato male può accadere questo attacco che avviene semplicemente con un browser web qualsiasi.
Prendiamo ad esempio questo programma:

[code:1:292bb1d738]
<?php if (IsSet($visitatore)) {
$fp = fopen("database", "a");
fwrite($fp, "<li>$visitatore\n");
fclose($fp); } ?>
<html>
<head></head>
<body>
<H1>Visitatori di questo sito:</H1>
<OL>
<?php $fp = fopen("database", "r");
print(fread($fp, filesize("/path/to/database")));
fclose($fp) ?>
</OL>
<HR>
<FORM><INPUT TYPE="TEXT" NAME="visitatore">
<INPUT TYPE="SUBMIT" NAME="submit" VALUE="Iscriviti!">
</FORM>
</BODY>
</HTML>
[/code:1:292bb1d738]

Questo programma implementa un guestbook molto rudimentale,
comunque, leggendo questo codice ci si dovrebbe sentire un po' a disagio.
Non credere nella rete.Questo programma accetta dati di moduli che ci si aspetta contengano il nome del visitatore(nella variabile $visitatore) e li archivia in un file di testo per visualizzarli al visitatore successivo.Per gli input che ci si aspetta, non c'è problema.
Adesso immaginatevi cosa succederebbe se l'input contenesse tag HTML.Questo semplice programma inserirebbe alla cieca quei tag nelle pagine che genera e altri browser di visitatori li interpreterebbero come al solito.Un tag particolarmente dannoso è il tag <SCRIPT>. Un hacker che desidera deturpare questa pagina web potrebbe duplicare l'aspetto della pagina sul suo server(www.badsite.com) e poi firmare nel libro degli ospiti con il "nome":

[code:1:292bb1d738]
<SCRIPT LANGUAGE="JavaScript">
window.location="http://www.badsite.com/</SCRIPT>
[/code:1:292bb1d738]

Quando i visitatori caricano il guestbook, i loro browser ricevono questo tag e immediatamente cominciano a caricare il sito pirata.
Con una piccola ingenuità, l'hacker potrebbe poi aprofittare della fiducia del visitatore del sito per estrarre informazioni personali come password o numeri di carta di credito.La soluzione a questo problema è disinfettare i dati in ingresso.In questo caso, si vuole che qualsiasi carattere che abbia un significato speciale per il bowser venga trasformato in qualcosa di innocuo.Fortunatamente php fornisce un modo per eseguire proprio questo tipo di trasformazione. La funzione htmlspecialchars() converte i caratteri '<', '>', '"' e '&' nella loro rappresentazione come entità di HTML (come <).La prima parte del programma è stata cambiata per utilizzare questa nuova funzione nel modo seguente:

[code:1:292bb1d738]
<?php if (IsSet($visitatore)) {
$fp = fopen("database", "a");
$visitatore_pulito = htmlspecialchars($visitatore);
fwrite($fp, "<li>$visitatore);
fclose($fp); } ?>
[/code:1:292bb1d738]

Ed è stato rattoppato un buco molto importante nel sito.