PHP 8 — Form e Superglobali

$_GET · $_POST · $_SESSION · $_COOKIE · Validazione input · PHP 8.5 · Marco Consiglio
Volta Institute · Napoli
A.A. 2026
📮 $_GET — dati passati nell'URL
$_GET è una superglobale — un array associativo disponibile automaticamente in ogni script PHP, senza doverla dichiarare — che contiene i dati passati tramite l'URL, dopo il punto interrogativo.
// URL visitato: pagina.php?nome=Marco&corso=FullStack <?php $nome = $_GET['nome'] ?? 'Ospite'; $corso = $_GET['corso'] ?? 'Nessuno'; echo "Ciao $nome, corso: $corso"; // → Ciao Marco, corso: FullStack ?>
💡 Ricorda l'operatore ?? visto nella guida Basi: è essenziale qui, perché un visitatore potrebbe arrivare alla pagina senza quei parametri nell'URL, e accedere direttamente a $_GET['nome'] senza controllo genererebbe un avviso.
🔗 Quando usare $_GET
✅ $_GET è adatto per dati non sensibili che ha senso vedere nell'URL: filtri di ricerca, numero di pagina, ID di un prodotto da visualizzare — dati "condivisibili" via link, dato che compaiono visibilmente nell'indirizzo.
⚠️ Mai usare $_GET per dati sensibili (password, dati bancari): l'URL può finire nella cronologia del browser, nei log del server, o essere condiviso per errore.
📤 $_POST — dati inviati da un form
$_POST raccoglie i dati inviati tramite un form HTML con method="post" — a differenza di $_GET, questi dati non compaiono nell'URL, rendendoli più adatti a informazioni sensibili o voluminose.
<form method="post" action="elabora.php"> <input type="text" name="nome"> <input type="email" name="email"> <button type="submit">Invia</button> </form> // elabora.php <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $nome = $_POST['nome'] ?? ''; $email = $_POST['email'] ?? ''; echo "Ricevuto: $nome, $email"; } ?>
💡 $_SERVER['REQUEST_METHOD'] è un'altra superglobale, utile per verificare se la pagina è stata raggiunta tramite un invio di form (POST) o una normale visita (GET) — un controllo comune prima di elaborare dati di un form.
🔐 $_SESSION — dati che persistono tra più pagine
Una sessione permette di conservare dati per un utente specifico attraverso più pagine/richieste — indispensabile per implementare un sistema di login, dato che HTTP di per sé non "ricorda" nulla tra una richiesta e l'altra.
// login.php <?php session_start(); // OBBLIGATORIO come prima riga eseguibile, in ogni pagina che usa $_SESSION if ($_POST['email'] === 'marco@volta.it') { $_SESSION['utente_loggato'] = true; $_SESSION['nome'] = 'Marco'; } ?> // pagina-protetta.php <?php session_start(); if (!isset($_SESSION['utente_loggato'])) { header('Location: login.php'); // reindirizza se non loggato exit; } echo "Benvenuto, {$_SESSION['nome']}"; ?>
⚠️ session_start() deve essere chiamata prima di qualsiasi output (anche uno spazio bianco prima del tag <?php!) — un errore molto comune è "headers already sent" quando questa regola non viene rispettata.
🍪 $_COOKIE — dati salvati nel browser dell'utente
A differenza di $_SESSION (dati sul server, legati a una sessione temporanea), i cookie vengono salvati direttamente nel browser dell'utente e possono persistere anche dopo la chiusura del browser, per un tempo che specifichi tu.
<?php // Impostare un cookie: nome, valore, scadenza (timestamp), percorso setcookie("tema", "scuro", time() + (86400 * 30), "/"); // scade tra 30 giorni // Leggere un cookie (in una richiesta SUCCESSIVA, dopo che il browser lo ha ricevuto): $tema = $_COOKIE['tema'] ?? 'chiaro'; echo "Tema selezionato: $tema"; ?>
⚠️ Un cookie appena impostato con setcookie() non è immediatamente disponibile in $_COOKIE nella STESSA richiesta — sarà leggibile solo dalla richiesta successiva, quando il browser lo rinvia al server.
🛡️ Validare i dati in ingresso — mai fidarsi dell'utente
Ogni dato che arriva da $_GET, $_POST o simili deve essere considerato potenzialmente pericoloso fino a prova contraria — un utente malintenzionato può inviare qualsiasi cosa, non solo ciò che il tuo form prevede.
<?php $email = $_POST['email'] ?? ''; if (empty($email)) { echo "L'email è obbligatoria"; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { echo "Formato email non valido"; } else { echo "Email valida: $email"; } ?>
✅ filter_var() con FILTER_VALIDATE_EMAIL è il modo standard e affidabile per validare un indirizzo email in PHP — molto più robusto di un controllo manuale con espressioni regolari scritte a mano.
🧼 htmlspecialchars() — proteggere l'output da XSS
<?php $commento = $_POST['commento'] ?? ''; // Se l'utente scrive: <script>alert('hackerato')</script> echo $commento; // ❌ PERICOLOSO: esegue lo script malevolo nel browser di chi legge la pagina echo htmlspecialchars($commento); // ✅ SICURO: stampa il testo letterale, i tag HTML non vengono interpretati ?>
⚠️ Regola d'oro: ogni volta che stampi dati provenienti dall'utente (commenti, nomi, messaggi) usa sempre htmlspecialchars() per prevenire attacchi XSS (Cross-Site Scripting) — questa regola sarà fondamentale nelle guide sui progetti pratici (Forum, CMS).
⚠️ Sicurezza essenziale — checklist minima
RischioDifesa
SQL InjectionPrepared statement con PDO (guida dedicata su PHP+MySQL)
XSS (script malevoli)htmlspecialchars() su ogni output di dati utente
Dati mancanti/malformatifilter_var(), controlli espliciti con empty()/isset()
Sessioni dirottatesession_regenerate_id() dopo login, cookie di sessione con flag sicuri
💡 Questa checklist non è esaustiva ma copre le difese minime indispensabili — ogni progetto pratico di questa serie (CMS, CRM, Forum...) applicherà questi principi concretamente.