PHP e Cookie: persistenza del consenso privacy con scadenza e rinnovo

by theArchitect
SHARE
PHP e Cookie: persistenza del consenso privacy con scadenza e rinnovo
© Guida-HTML5.it

Introduzione

Quando si parla di cookie e persistenza in PHP, spesso si pensa subito al login automatico o alle preferenze dell’utente. C’è però un caso d’uso molto pratico e attuale: memorizzare il consenso privacy/cookie policy in modo persistente, così da non mostrare il banner a ogni visita e rispettare al tempo stesso le scadenze previste dalla normativa e dalle scelte dell’utente.

Questo scenario è utile in siti aziendali, blog, e-commerce e applicazioni web che devono gestire in modo corretto il consenso all’uso dei cookie non tecnici. L’obiettivo non è solo “nascondere il banner”, ma farlo in modo pulito, sicuro e manutenibile.

In questo tutorial vedremo come:

  • salvare il consenso in un cookie persistente;
  • leggere il cookie nelle richieste successive;
  • gestire il rinnovo della scadenza;
  • prevedere il rifiuto del consenso;
  • impostare alcune best practice fondamentali.

Codice completo

Di seguito trovi un esempio completo e originale in PHP. Il codice mostra un piccolo sistema di consenso privacy con tre stati: accetta, rifiuta e nessuna scelta.

<?php
declare(strict_types=1);

// Durata del consenso: 6 mesi
const CONSENT_COOKIE_NAME = ´site_consent´;
const CONSENT_COOKIE_LIFETIME = 60 * 60 * 24 * 30 * 6;

// Funzione per leggere il consenso dal cookie
function getConsent(): ?string
{
    if (!isset($_COOKIE[CONSENT_COOKIE_NAME])) {
        return null;
    }

    $value = $_COOKIE[CONSENT_COOKIE_NAME];

    // Accettiamo solo valori previsti
    if (in_array($value, [´accepted´, ´rejected´], true)) {
        return $value;
    }

    return null;
}

// Funzione per salvare il consenso
function setConsent(string $value): void
{
    if (!in_array($value, [´accepted´, ´rejected´], true)) {
        throw new InvalidArgumentException(´Valore consenso non valido.´);
    }

    $options = [
        ´expires´  => time() + CONSENT_COOKIE_LIFETIME,
        ´path´     => ´/´,
        ´secure´   => !empty($_SERVER[´HTTPS´]),
        ´httponly´ => true,
        ´samesite´ => ´Lax´,
    ];

    setcookie(CONSENT_COOKIE_NAME, $value, $options);

    // Aggiorna anche il valore disponibile nella richiesta corrente
    $_COOKIE[CONSENT_COOKIE_NAME] = $value;
}

// Funzione per cancellare il cookie di consenso
function clearConsent(): void
{
    setcookie(CONSENT_COOKIE_NAME, ´´, [
        ´expires´  => time() - 3600,
        ´path´     => ´/´,
        ´secure´   => !empty($_SERVER[´HTTPS´]),
        ´httponly´ => true,
        ´samesite´ => ´Lax´,
    ]);

    unset($_COOKIE[CONSENT_COOKIE_NAME]);
}

// Gestione form
if ($_SERVER[´REQUEST_METHOD´] === ´POST´) {
    $action = $_POST[´consent_action´] ?? ´´;

    if ($action === ´accept´) {
        setConsent(´accepted´);
        header(´Location: ´ . $_SERVER[´PHP_SELF´]);
        exit;
    }

    if ($action === ´reject´) {
        setConsent(´rejected´);
        header(´Location: ´ . $_SERVER[´PHP_SELF´]);
        exit;
    }

    if ($action === ´reset´) {
        clearConsent();
        header(´Location: ´ . $_SERVER[´PHP_SELF´]);
        exit;
    }
}

$consent = getConsent();

// Esempio di logica: carica script non tecnici solo se consenso accettato
$canLoadAnalytics = ($consent === ´accepted´);
?>

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Consenso privacy</title>
</head>
<body>

<h1>Demo consenso privacy</h1>

<?php if ($consent === null): ?>
    <div style="padding: 1rem; border: 1px solid #ccc; margin-bottom: 1rem;">
        <p>Questo sito utilizza cookie tecnici e, solo previo consenso, cookie di analisi.</p>
        <form method="post">
            <button type="submit" name="consent_action" value="accept">Accetta</button>
            <button type="submit" name="consent_action" value="reject">Rifiuta</button>
        </form>
    </div>
<?php elseif ($consent === ´accepted´): ?>
    <p>Hai accettato i cookie non tecnici. Il banner non verrà mostrato fino alla scadenza.</p>
<?php elseif ($consent === ´rejected´): ?>
    <p>Hai rifiutato i cookie non tecnici. Il sito rispetterà questa scelta fino alla scadenza.</p>
<?php endif; ?>

<h2>Stato attuale</h2>
<p>Consenso salvato: <strong><?= htmlspecialchars($consent ?? ´nessuno´, ENT_QUOTES, ´UTF-8´) ?></strong></p>

<h2>Contenuto condizionale</h2>
<?php if ($canLoadAnalytics): ?>
    <p>Qui potresti caricare script di analytics o marketing.</p>
<?php else: ?>
    <p>Gli script non essenziali non vengono caricati.</p>
<?php endif; ?>

<form method="post" style="margin-top: 1rem;">
    <button type="submit" name="consent_action" value="reset">Reset consenso</button>
</form>

</body>
</html>

Spiegazione

Il cuore dell’esempio è semplice: il consenso viene salvato in un cookie chiamato site_consent. Il valore può essere solo uno tra accepted e rejected. In questo modo evitiamo dati ambigui o non previsti.

1. Lettura del cookie

La funzione getConsent() controlla se il cookie esiste in $_COOKIE. Se non c’è, restituisce null, cioè nessuna scelta ancora espressa. Se il valore presente non è tra quelli consentiti, viene scartato. Questo è importante perché i cookie possono essere modificati lato client.

2. Scrittura del cookie

La funzione setConsent() usa setcookie() con un array di opzioni. È la forma moderna e più leggibile. Le impostazioni principali sono:

  • expires: imposta la scadenza del cookie a 6 mesi;
  • path: lo rende disponibile su tutto il sito;
  • secure: lo invia solo su HTTPS, se disponibile;
  • httponly: impedisce l’accesso da JavaScript;
  • samesite: riduce il rischio di invii cross-site indesiderati.

Subito dopo setcookie(), aggiorniamo anche $_COOKIE. Questo non sostituisce il cookie reale, ma permette al codice della richiesta corrente di vedere subito il nuovo valore senza dover fare un refresh aggiuntivo.

3. Cancellazione del cookie

Per cancellare un cookie non basta “rimuoverlo”: bisogna riscriverlo con una data di scadenza nel passato. La funzione clearConsent() fa proprio questo. È utile se vuoi offrire all’utente un pulsante “reset consenso” o se devi adeguarti a una nuova policy.

4. Gestione del form

Il form HTML invia un campo chiamato consent_action. In base al valore, il server salva, rifiuta o cancella il consenso. Dopo il salvataggio, usiamo un redirect verso la stessa pagina con header(´Location: ...´). Questo evita doppi invii del form se l’utente aggiorna la pagina.

5. Contenuto condizionale

Una volta letto il consenso, puoi decidere se caricare o meno contenuti non essenziali. Nell’esempio, la variabile $canLoadAnalytics diventa vera solo se il consenso è accepted. In un progetto reale, potresti usarla per includere script di analytics, pixel di marketing o widget esterni.

Best practice

Gestire cookie di persistenza in PHP è semplice, ma ci sono alcune regole da seguire per farlo bene.

  • Usa sempre HTTPS quando possibile. Il flag secure protegge il cookie durante il trasferimento.
  • Non salvare dati sensibili nel cookie del consenso. Basta un valore minimo come accepted o rejected.
  • Valida sempre il contenuto letto da $_COOKIE. Non fidarti mai del client.
  • Imposta una scadenza chiara e coerente con la tua policy. Evita cookie “eterni”.
  • Usa SameSite per migliorare la sicurezza e limitare i contesti di invio del cookie.
  • Offri un modo semplice per cambiare idea. L’utente deve poter revocare o modificare il consenso.
  • Separa la logica PHP dalla presentazione quando il progetto cresce. In un’applicazione reale, puoi spostare funzioni e configurazioni in file dedicati.

Un altro aspetto importante è la coerenza con la normativa applicabile. Il cookie di consenso deve servire a ricordare una scelta esplicita dell’utente, non a tracciare comportamenti in modo occulto. Questo approccio è corretto sia dal punto di vista tecnico sia da quello etico.

Riepilogo

In questo tutorial abbiamo visto un uso concreto e molto diffuso dei cookie in PHP: la persistenza del consenso privacy. È un caso d’uso utile perché unisce semplicità tecnica, esperienza utente migliore e attenzione alla sicurezza.

  • Il consenso viene salvato in un cookie persistente.
  • Alla visita successiva, PHP legge il cookie e decide se mostrare il banner.
  • Il valore del cookie è limitato a opzioni previste e validate.
  • La scadenza è gestita in modo chiaro e il consenso può essere cancellato.
  • Con secure, httponly e samesite il cookie è più robusto.

Questo modello è facilmente adattabile anche ad altri casi: salvataggio di scelte di navigazione, preferenze di visualizzazione o stati temporanei che devono sopravvivere tra una visita e l’altra.

Approfondisci con risorse ufficiali

  • Manuale PHP - setcookie(): documentazione ufficiale sulla creazione e gestione dei cookie.
  • Manuale PHP - $_COOKIE: superglobal per leggere i cookie inviati dal browser.
  • Manuale PHP - header(): utile per gestire redirect dopo il salvataggio del consenso.
  • MDN Web Docs - HTTP Cookies: ottima panoramica tecnica sul funzionamento dei cookie nel browser.
  • Garante per la protezione dei dati personali: risorse utili per comprendere gli aspetti normativi legati ai cookie.

SHARE