Quando un utente compila un form, spesso pensiamo che inserisca solo testi normali: il proprio nome, un commento, un’email.
Ma non è sempre così. Un utente malintenzionato potrebbe provare a inserire codice HTML o JavaScript al posto del testo.
Questo tipo di attacco si chiama XSS (Cross-Site Scripting) e può permettere all’hacker di:
- eseguire codice malevolo nel browser degli altri utenti
- rubare cookie e sessioni
- alterare contenuti della pagina
- reindirizzare a siti esterni
- manipolare form o dati sensibili
Per questo motivo è fondamentale sanificare tutti i dati che arrivano dall’utente.
La sanificazione protegge la tua applicazione da codice malevolo:
$nome = htmlspecialchars($_POST['nome'], ENT_QUOTES, 'UTF-8');
$email = htmlspecialchars($_POST['email'], ENT_QUOTES, 'UTF-8');
Esempio di attacco XSS
Immagina un form che chieda un semplice nome:
<input type="text" name="nome">
E il tuo script PHP stampa il nome così:
echo "Ciao $nome!";
Un utente malintenzionato potrebbe inviare:
<script>alert('Hacked!')</script>
Il browser eseguirebbe il codice JavaScript e mostrerebbe un alert, ma potrebbe fare molto di più.
Come proteggersi: sanificazione con htmlspecialchars()
La difesa più semplice e efficace è convertire i caratteri speciali in testo inoffensivo.
$nome = htmlspecialchars($_POST['nome'], ENT_QUOTES, 'UTF-8');
Cosa fa?
<diventa<>diventa>'diventa'"diventa"
In questo modo il browser non eseguirà più eventuale codice inserito dall'utente: lo mostrerà come semplice testo.
Senza sanificazione
Input dell’utente:
<script>alert('Hacked!')</script>
Output della pagina:
(esegue l’alert!)
Con sanificazione
Output:
<script>alert('Hacked!')</script>
Risultato:
Il codice non viene eseguito → Problema evitato.
Sanificare ≠ Validare
È importante capire la differenza:
- Validare → controlli che il dato sia accettabile (es. “l’email è valida?”)
- Sanificare → trasformi il dato per renderlo sicuro
Spesso vanno usate entrambe.
Quando bisogna sanificare?
👉 Sempre, quando mostri un dato inserito dall’utente in una pagina HTML.
Commenti, nomi, descrizioni, messaggi: tutto può essere usato per un attacco XSS.
Altri metodi utili
Sebbene htmlspecialchars() sia lo standard, ci sono situazioni particolari in cui si può usare:
- strip_tags() → rimuove i tag HTML (ma non basta per sicurezza totale)
- filter_var($var, FILTER_SANITIZE_...) → varie opzioni di sanificazione
E per applicazioni più complesse:
- librerie template (Twig, Blade)
- escaping automatico lato framework
In conclusione
- ❗ Qualsiasi input può contenere codice malevolo.
- 🛡 Sanificare significa "neutralizzare" quel codice.
- ✔️
htmlspecialchars()è il metodo più semplice ed efficace. - 🔒 È un passaggio essenziale per la sicurezza delle applicazioni PHP.