Situazione attuale: PHP2Shell. Due vulnerabilità critiche di PHP (CVSS 9,2) consentono codice dannoso senza autenticazione. Patch dal 21/10/2026.Che cosa fare ora →

Sessioni e cookie in PHP

Le sessioni trasformano l'HTTP privo di stato in un login che regge su più pagine. Qui si vede come PHP lo risolve, quali valori predefiniti valgono e che cosa c'entra session.upload_progress con PHP2Shell.

Stato 5 min di letturaConoscere PHP

In breve: l'HTTP non ricorda nulla tra due richieste. Una sessione PHP risolve il problema: PHP assegna un ID di sessione casuale, lo invia al browser come cookie e memorizza sul server i dati corrispondenti, per impostazione predefinita come file. A ogni richiesta successiva session_start() rilegge i dati in base all'ID. Alla sessione PHP appartiene anche la funzione session.upload_progress, che php.net raccomanda di disattivare temporaneamente lato server a causa di PHP2Shell.

Perché le applicazioni web hanno bisogno delle sessioni

Ogni richiesta a un server web è a sé stante. Senza un meccanismo aggiuntivo uno shop, al clic su «Carrello», non saprebbe più chi vi abbia appena inserito qualcosa, e un'area di amministrazione dovrebbe chiedere la password a ogni clic. Le sessioni collegano le singole richieste in una sessione di lavoro.

Per chi decide significa: dopo il login l'ID di sessione vale quanto nome utente e password insieme. Per gli amministratori significa: dove e come stanno i dati di sessione è una questione di sicurezza, soprattutto sui server con più siti web.

Che cosa accade con session_start()

Il flusso è lo stesso a ogni richiesta e si può descrivere in cinque passaggi:

  1. Il browser invia il cookie con il nome della sessione, per impostazione predefinita PHPSESSID.
  2. session_start() legge l'ID e lo passa al gestore di archiviazione, per impostazione predefinita files.
  3. Il gestore carica i dati memorizzati, PHP li riconverte con il serialize_handler e riempie $_SESSION.
  4. Lo script legge e modifica $_SESSION come un normale array.
  5. Alla fine della richiesta PHP riscrive i dati. Con session.lazy_write (predefinito: attivo) solo se sono cambiati.
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];

Se non esiste ancora una sessione, PHP genera un nuovo ID e imposta il cookie. Se session.use_strict_mode è attivo, PHP rifiuta ID sconosciuti imposti dal browser e ne genera uno nuovo. Il manuale PHP definisce questa impostazione indispensabile per la sicurezza di base.

Valori predefiniti da conoscere

I valori seguenti valgono, secondo il manuale PHP, se non è configurato altro. Molte distribuzioni e hoster impostano valori propri, perciò conta sempre la configurazione effettivamente in vigore.

Impostazione Predefinito Significato
session.save_handler files luogo di archiviazione dei dati, possibili anche Redis o database
session.name PHPSESSID nome del cookie
session.serialize_handler php formato dei dati memorizzati
session.use_strict_mode 0 gli ID sconosciuti vengono accettati
session.use_only_cookies 1 nessun ID di sessione nell'indirizzo
session.cookie_httponly 0 JavaScript può leggere il cookie
session.cookie_secure 0 cookie anche su HTTP non cifrato
session.cookie_samesite vuoto nessun attributo SameSite
session.gc_maxlifetime 1440 secondi prima della possibile pulizia
session.gc_probability / gc_divisor 1 / 100 pulizia circa a ogni centesimo avvio
session.upload_progress.enabled 1 l'avanzamento dell'upload viene scritto nella sessione

I valori per cookie_httponly, cookie_secure e use_strict_mode non sono dunque predisposti di fabbrica per la sicurezza. Come impostarli correttamente lo descrive la guida Mettere in sicurezza le sessioni in PHP. Le impostazioni session.sid_length e session.sid_bits_per_character sono contrassegnate come obsolete da PHP 8.4.0.

Oltre al cookie di sessione, un'applicazione può impostare cookie propri. Da PHP 7.3.0 setcookie() accetta a questo scopo un array di opzioni, incluso samesite. Da PHP 8.5.0 esiste inoltre l'opzione partitioned.

<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

Secondo il manuale, con samesite uguale a None deve essere impostato anche secure, altrimenti il browser blocca il cookie. I cookie sono dati del browser: il loro contenuto torna alla richiesta successiva tramite $_COOKIE e va verificato come ogni altro input. Maggiori dettagli nella pagina Superglobali.

session.upload_progress: indicatore di avanzamento per gli upload

PHP può scrivere nella sessione l'avanzamento durante un upload di file. A questo scopo il modulo invia un campo nascosto con il nome tratto da session.upload_progress.name, per impostazione predefinita PHP_SESSION_UPLOAD_PROGRESS. PHP deposita allora i dati in $_SESSION sotto una chiave con il prefisso upload_progress_, con indicazioni come ora di inizio, dimensione totale e byte già elaborati.

Importante per la comprensione: secondo il manuale PHP scrive queste informazioni nella sessione prima che venga eseguito qualsiasi script. La funzione lavora quindi durante l'elaborazione della richiesta, ancora prima del codice dell'applicazione. Le sue impostazioni sono di tipo INI_PERDIR e non si possono modificare a runtime.

Sessioni e PHP2Shell: la misura transitoria

Come una delle misure transitorie contro le vulnerabilità di PHP2Shell php.net indica di impostare session.upload_progress.enabled=0 nel php.ini, nel pool FPM o nella configurazione del server e di riavviare poi tutti i worker, espressamente non tramite ini_set() o .user.ini. Il 23/10/2026 si è aggiunta l'indicazione su CVE-2026-115560, con lo stesso rimedio fino alla successiva bugfix release regolare.

; pool FPM del sito web, poi riavviare tutti i worker
php_admin_flag[session.upload_progress.enabled] = off

Secondo i resoconti specializzati questa impostazione da sola non chiude entrambe le vulnerabilità. L'obbligo resta l'aggiornamento a PHP 8.5.12, 8.4.27, 8.3.36 o 8.2.35. Se la Sua applicazione usi davvero l'avanzamento dell'upload e come impostare l'opzione in modo duraturo lo descrive l'articolo Disattivare session.upload_progress.

Come aiuta concretamente PHP SOS?

  • Leggiamo le impostazioni di sessione effettivamente in vigore per ogni sito web, non solo i valori della riga di comando.
  • Impostiamo le misure transitorie di PHP2Shell per ogni pool, riavviamo tutti i worker e verifichiamo il risultato.
  • Separiamo i luoghi di archiviazione delle sessioni e gli utenti dei pool tra i siti web nell'ambito dell'hardening del server.
  • Dopo un incidente invalidiamo tutte le sessioni esistenti, perché gli ID di sessione rubati perdano valore.

Domande frequenti

Qual è la differenza tra cookie e sessione?

Un cookie è un piccolo insieme di dati che il browser memorizza e invia a ogni richiesta. Una sessione memorizza i dati veri e propri sul server; nel cookie c'è solo un identificatore casuale, l'ID di sessione.

Quanto vive una sessione PHP?

Il cookie di sessione vale per impostazione predefinita finché il browser non viene chiuso. I dati sul server possono essere ripuliti dopo session.gc_maxlifetime, per impostazione predefinita 1440 secondi senza accessi. Quando accada davvero dipende dalla logica di pulizia del sistema.

Che cosa fa session.upload_progress?

La funzione scrive durante un upload di file l'avanzamento nella sessione, in modo che una seconda richiesta possa mostrarlo. È attiva per impostazione predefinita. A causa di PHP2Shell php.net raccomanda di disattivarla temporaneamente lato server.

Basta disattivare session.upload_progress con ini_set()?

No. Secondo il manuale l'impostazione non si può comunque modificare a runtime e php.net indica espressamente php.ini, pool FPM o configurazione del server come luoghi corretti, non ini_set() o .user.ini. Poi riavviare tutti i worker.

Fonti

Contatto immediato

Ogni ora conta. Ci scriva adesso.

Descriva brevemente sistema, versione di PHP e quanto osservato. Ci faremo sentire, chiariremo la situazione e lavoreremo da remoto fino alla chiusura e alla documentazione dell'incidente.

Aiuto immediato