Convalida del modulo PHP
Questo e i prossimi capitoli mostrano come utilizzare PHP per convalidare i dati dei moduli.
Convalida del modulo PHP
Pensa alla SICUREZZA durante l'elaborazione dei moduli PHP!
Queste pagine mostreranno come elaborare i moduli PHP tenendo conto della sicurezza. La corretta convalida dei dati del modulo è importante per proteggere il tuo modulo da hacker e spammer!
Il modulo HTML su cui lavoreremo in questi capitoli, contiene vari campi di input: campi di testo obbligatori e opzionali, pulsanti di opzione e un pulsante di invio:
Le regole di convalida per il modulo di cui sopra sono le seguenti:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
Per prima cosa esamineremo il semplice codice HTML per il modulo:
Campi di testo
I campi del nome, dell'e-mail e del sito Web sono elementi di input di testo e il campo dei commenti è un'area di testo. Il codice HTML è simile a questo:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
Tasti della radio
I campi del sesso sono pulsanti di opzione e il codice HTML è simile al seguente:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
L'elemento della forma
Il codice HTML del modulo è simile al seguente:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Quando il modulo viene inviato, i dati del modulo vengono inviati con method="post".
Che cos'è la variabile $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] è una variabile super globale che restituisce il nome del file dello script attualmente in esecuzione.
Quindi, $_SERVER["PHP_SELF"] invia i dati del modulo inviato alla pagina stessa, invece di passare a una pagina diversa. In questo modo, l'utente riceverà messaggi di errore sulla stessa pagina del modulo.
Cos'è la funzione htmlspecialchars()?
La funzione htmlspecialchars() converte i caratteri speciali in entità HTML. Ciò significa che sostituirà i caratteri HTML come < e > con < e >. Ciò impedisce agli aggressori di sfruttare il codice iniettando codice HTML o Javascript (attacchi Cross-site Scripting) nei moduli.
Grande nota sulla sicurezza dei moduli PHP
La variabile $_SERVER["PHP_SELF"] può essere utilizzata dagli hacker!
Se nella tua pagina viene utilizzato PHP_SELF, un utente può inserire una barra (/) e quindi alcuni comandi Cross Site Scripting (XSS) da eseguire.
Il cross-site scripting (XSS) è un tipo di vulnerabilità della sicurezza del computer che si trova in genere nelle applicazioni Web. XSS consente agli aggressori di iniettare script lato client nelle pagine Web visualizzate da altri utenti.
Supponiamo di avere il seguente modulo in una pagina denominata "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Ora, se un utente inserisce l'URL normale nella barra degli indirizzi come "http://www.example.com/test_form.php", il codice sopra sarà tradotto in:
<form method="post" action="test_form.php">
Fin qui tutto bene.
Tuttavia, considera che un utente inserisce il seguente URL nella barra degli indirizzi:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
In questo caso, il codice di cui sopra verrà tradotto in:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Questo codice aggiunge un tag di script e un comando di avviso. E quando la pagina viene caricata, il codice JavaScript verrà eseguito (l'utente vedrà una finestra di avviso). Questo è solo un semplice e innocuo esempio di come sfruttare la variabile PHP_SELF.
Tieni presente che qualsiasi codice JavaScript può essere aggiunto all'interno del tag <script>! Un hacker può reindirizzare l'utente a un file su un altro server e quel file può contenere codice dannoso che può alterare le variabili globali o inviare il modulo a un altro indirizzo per salvare i dati dell'utente, ad esempio.
Come evitare gli exploit di $_SERVER["PHP_SELF"]?
Gli exploit $_SERVER["PHP_SELF"] possono essere evitati usando la funzione htmlspecialchars().
Il codice del modulo dovrebbe assomigliare a questo:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
La funzione htmlspecialchars() converte i caratteri speciali in entità HTML. Ora se l'utente tenta di sfruttare la variabile PHP_SELF, risulterà nel seguente output:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Il tentativo di exploit fallisce e non viene fatto alcun danno!
Convalida i dati del modulo con PHP
La prima cosa che faremo è passare tutte le variabili attraverso la funzione htmlspecialchars() di PHP.
Quando usiamo la funzione htmlspecialchars(); quindi se un utente tenta di inviare quanto segue in un campo di testo:
<script>location.href('http://www.hacked.com')</script>
- questo non verrebbe eseguito, perché verrebbe salvato come codice di escape HTML, in questo modo:
<script>location.href('http://www.hacked.com')</script>
Il codice è ora sicuro per essere visualizzato su una pagina o all'interno di un'e-mail.
Faremo anche altre due cose quando l'utente invia il modulo:
- Elimina i caratteri non necessari (spazio extra, tabulazione, nuova riga) dai dati di input dell'utente (con la funzione PHP trim())
- Rimuovere le barre inverse (\) dai dati di input dell'utente (con la funzione PHP stripslashes())
Il passo successivo è creare una funzione che faccia tutto il controllo per noi (che è molto più conveniente che scrivere lo stesso codice più e più volte).
Chiameremo la funzione test_input().
Ora possiamo controllare ogni variabile $_POST con la funzione test_input() e lo script si presenta così:
Esempio
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Si noti che all'inizio dello script, controlliamo se il modulo è stato inviato utilizzando $_SERVER["REQUEST_METHOD"]. Se REQUEST_METHOD è POST, il modulo è stato inviato e dovrebbe essere convalidato. Se non è stato inviato, salta la convalida e visualizza un modulo vuoto.
Tuttavia, nell'esempio sopra, tutti i campi di input sono facoltativi. Lo script funziona bene anche se l'utente non inserisce alcun dato.
Il passaggio successivo consiste nel rendere obbligatori i campi di input e creare messaggi di errore, se necessario.