Validazione dei moduli PHP

Questa sezione e la sezione successiva spiegano come utilizzare PHP per verificare i dati dei moduli.

Validazione dei moduli PHP

Suggerimento:Fare attenzione alla sicurezza quando si gestiscono moduli PHP!

Queste pagine mostreranno come gestire in sicurezza i moduli PHP. La validazione dei dati del modulo HTML è importante per prevenire gli hacker e lo spam!

L'HTML del modulo che useremo in seguito contiene vari tipi di campi di input: campi di testo obbligatori e opzionali, pulsanti di opzione e pulsante di invio:

Il modulo sopra utilizza le seguenti regole di validazione:

Campo Regole di validazione
Nome Obbligatorio. Deve contenere lettere e spazi.
E-mail Obbligatorio. Deve contenere un indirizzo email valido (che include @ e .).
Sito web Opzionale. Se compilato, deve contenere un URL valido.
Commento Opzionale. Campo di input multilinha (casella di testo).
Gender Obbligatorio. È necessario selezionare un'opzione.

Prima di tutto, diamo un'occhiata al codice HTML puro di questo modulo:

Campo di testo

Il campo name, email e website appartengono agli elementi di input di testo, il campo comment è una casella di testo. Il codice HTML è il seguente:

Nome: <input type="text" name="name">
E-mail: <input type="text" name="email">
Sito web: <input type="text" name="website">
Commento: <textarea name="comment" rows="5" cols="40"></textarea>

Pulsante di opzione

Il campo gender è un pulsante di opzione, il codice HTML è il seguente:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

Elementi del modulo

Il codice HTML del modulo è il seguente:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>

Quando si invia questo modulo, i dati del modulo vengono inviati tramite method="post".

Cos'è la variabile $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] è una variabile superglobale che restituisce il nome del file dello script attualmente eseguito.

Quindi, $_SERVER["PHP_SELF"] invia i dati del modulo alla pagina stessa, non saltando a un'altra pagina. In questo modo, l'utente può ricevere informazioni di errore nella pagina del modulo.

Cos'è la funzione htmlspecialchars()?

La funzione htmlspecialchars() trasforma i caratteri speciali in entità HTML. Questo significa che i caratteri HTML come < e > vengono sostituiti con < e >. Questo impedisce agli attaccanti di sfruttare HTML o JavaScript注入 nei form (attacchi cross-site scripting).

Importante suggerimento sulla sicurezza dei form PHP

La variabile $_SERVER["PHP_SELF"] può essere sfruttata dagli hacker!

Se la tua pagina utilizza PHP_SELF, gli utenti possono inserire trattini di basso e eseguire script cross-site (XSS).

Suggerimento:Cross-site scripting (XSS) è un tipo di vulnerabilità di sicurezza informatica, comune nelle applicazioni web. XSS permette agli attaccanti di inserire script client su pagine web visitate da altri utenti.

Supponiamo che una pagina chiamata "test_form.php" contenga il seguente modulo:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Ora, se l'utente accede a un URL normale nella barra degli indirizzi: "http://www.example.com/test_form.php", il codice sopra viene convertito in:

<form method="post" action="test_form.php">

Fino ad ora, tutto è normale.

Ma, se l'utente ha inserito l'URL seguente nella barra degli indirizzi:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

In questo caso, il codice sopra viene convertito in:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

Questo codice aggiunge uno script e un comando di avviso. E quando questa pagina viene caricata, viene eseguito il codice JavaScript (l'utente vedrà una finestra di avviso). Questo è solo un caso semplice e innocuo su come viene utilizzato il variabile PHP_SELF.

Dovresti essere consapevole Il tag <script> può aggiungere qualsiasi codice JavaScript!Gli hacker possono reindirizzare l'utente a un file su un altro server, il cui codice maligno può modificare variabili globali o inviare il modulo a un altro indirizzo per salvare i dati dell'utente, ecc.

Come evitare che $_SERVER["PHP_SELF"] venga sfruttato?

Utilizzando la funzione htmlspecialchars() possiamo evitare che $_SERVER["PHP_SELF"] venga sfruttato.

Il codice del modulo è il seguente:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

La funzione htmlspecialchars() trasforma i caratteri speciali in entità HTML. Ora, se l'utente tenta di sfruttare la variabile PHP_SELF, il risultato sarà il seguente:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

Impossibile sfruttare, nessun danno!

Verifica dei dati del modulo tramite PHP

La prima cosa da fare è passare tutte le variabili attraverso la funzione PHP htmlspecialchars().

Dopo aver utilizzato la funzione htmlspecialchars(), se l'utente tenta di inviare il seguente contenuto nel campo di testo:

<script>location.href('http://www.hacked.com')</script>

- Il codice non verrà eseguito perché verrà salvato come codice escapato, come questo:

<script>location.href('http://www.hacked.com')</script>

Ora questa riga di codice è sicura da visualizzare sulla pagina o nell'email.

Quando l'utente invia il modulo, dobbiamo fare due cose:

  1. (Attraverso la funzione PHP trim()) Rimuovere i caratteri inutili dai dati di input dell'utente (spazi in eccesso, tabulazioni, newline)
  2. (Attraverso la funzione PHP stripslashes()) Rimuovere gli backslash () dai dati di input dell'utente

Poi creiamo una funzione di controllo (più efficiente rispetto a scrivere codice ripetutamente).

Nomeiamo la funzione test_input()

Ora, possiamo controllare ogni variabile $_POST tramite la funzione test_input(),lo script è il seguente:

Esempio

<?php
// Definire variabili e impostarle a valore nullo
$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;
}
?>

Esempio di esecuzione

Si prega di notare che all'inizio dello script abbiamo verificato se il modulo è stato inviato utilizzando $_SERVER["REQUEST_METHOD"]. Se REQUEST_METHOD è POST, il modulo è stato inviato e deve essere verificato. Se non è stato inviato, saltare la verifica e visualizzare un modulo vuoto.

Tuttavia, nell'esempio sopra, tutti i campi di input sono opzionali. Anche se l'utente non inserisce alcun dato, lo script funzionerà correttamente.

Il passo successivo è creare i campi di input obbligatori e creare i messaggi di errore da utilizzare quando necessario.