0Pricing
PHP Academy · Lezione

Sanificazione degli input utente

Rimuovere i caratteri pericolosi con htmlspecialchars e filter_input.

Sanificazione degli input utente è una lezione PHP Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento PHP Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso PHP Academy include 4 lezioni in totale.

Sanificazione e validazione a confronto

La validazione verifica se i dati soddisfano i requisiti e li rifiuta in caso contrario.
La sanificazione pulisce i dati rimuovendo o codificando i caratteri pericolosi, così da renderli sicuri da utilizzare.

Servono entrambe: prima validi, poi sanifichi l'output.

htmlspecialchars() per l'output HTML

Esegua sempre l'escaping dell'output prima di inserirlo nell'HTML, per prevenire gli attacchi XSS:

<?php
$name = '<script>alert(1)</script>';

// Dangerous — executes script:
// echo $name;

// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// &lt;script&gt;alert(1)&lt;/script&gt;

htmlentities() e htmlspecialchars() a confronto

Entrambe eseguono l'escaping dell'HTML, ma htmlentities converte TUTTI i caratteri applicabili, mentre htmlspecialchars converte solo i cinque più pericolosi:

<?php
$str = '<b>caf&eacute;</b> & "bar"';

// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

// htmlentities: also converts é → &eacute;
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8

filter_var FILTER_SANITIZE_*

Le modalità di sanificazione di filter_var rimuovono i contenuti pericolosi:

<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com

$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;

strip_tags()

Rimuova i tag HTML da una stringa, mantenendo facoltativamente i tag consentiti:

<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';

// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)

// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>

Sanificazione per SQL

Non sanifichi mai le query SQL con funzioni per stringhe: utilizzi sempre le istruzioni preparate. L'approccio corretto è:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');

// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";

// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();

addslashes() e istruzioni preparate a confronto

addslashes() esegue l'escaping di barre rovesciate e virgolette, ma NON è sicura per SQL. Utilizzi invece le istruzioni preparate di PDO. addslashes() può comunque essere utile per scopi non legati a SQL, ad esempio per generare stringhe JavaScript:

<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";

Sanificazione dei nomi dei file

Rimuova i caratteri pericolosi dai nomi dei file caricati:

<?php
function sanitizeFilename(string $name): string {
    // Remove path traversal chars and other dangerous ones
    $name = basename($name);                          // strip any path
    $name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
    $name = preg_replace('/_{2,}/', '_', $name);      // collapse underscores
    return strtolower($name);
}

echo sanitizeFilename('../../../etc/passwd');   // etc_passwd
echo sanitizeFilename('My Photo (1).JPG');      // my_photo_1_.jpg

Conversione a intero degli ID

La sanificazione più semplice per gli ID numerici consiste nel convertirli in int, eliminando così qualsiasi contenuto non numerico:

<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";

// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');

// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');

Il contesto dell'output è importante

Contesti di output diversi richiedono metodi di escaping diversi:

  • Corpo HTML → htmlspecialchars()
  • Attributo HTML → htmlspecialchars(ENT_QUOTES)
  • JSON/JavaScript → json_encode()
  • Parametro URL → urlencode()
  • SQL → istruzioni preparate

urlencode e rawurlencode

Codifichi i valori da utilizzare negli URL:

<?php
$search = 'hello world & PHP';

echo urlencode($search);
// hello+world+%26+PHP  (+ for spaces)

echo rawurlencode($search);
// hello%20world%20%26%20PHP  (RFC 3986 — use in paths)

$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;

Verifica rapida

Qual è il modo corretto per prevenire l'iniezione SQL quando si utilizzano dati inseriti dall'utente in una query al database?

Riepilogo: sanificazione dell'input

Regole per la sanificazione:

  • Output HTML → htmlspecialchars(ENT_QUOTES, 'UTF-8')
  • SQL → istruzioni preparate, mai escaping tramite stringhe
  • URL → urlencode() o rawurlencode()
  • Nomi dei file → rimuova i caratteri con una regex e utilizzi basename()
  • ID interi → conversione con (int)
  • Tag → strip_tags() per filtrare i tag consentiti

Domande Frequenti

La lezione «Sanificazione degli input utente» è gratuita?

Sì — il testo completo di «Sanificazione degli input utente» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso PHP Academy, passa a CoddyKit PRO. Il corso PHP Academy include 4 lezioni in totale.

Cosa imparerò in «Sanificazione degli input utente»?

Rimuovere i caratteri pericolosi con htmlspecialchars e filter_input. Eserciti PHP Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare PHP Academy?

Non è richiesta alcuna esperienza precedente. PHP Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Sanificazione degli input utente»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione PHP Academy?

Sì. Ogni lezione PHP Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. GET e POST: quando usare ciascuno
  2. Leggere i dati dei moduli con le superglobali
  3. Tecniche di validazione degli input
  4. Sanificazione degli input utente
← Torna a PHP Academy