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 &lt;
  • > diventa &gt;
  • ' diventa &#039;
  • " diventa &quot;

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:

&lt;script&gt;alert('Hacked!')&lt;/script&gt;

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.
🐍

Vuoi imparare Python da zero?

Scarica la guida gratuita Python in 10 giorni: 10 lezioni pratiche con esempi ed esercizi, direttamente nella tua email.

📥 Scarica gratis il PDF →