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 →

Limitare in modo sensato post_max_size e upload_max_filesize

I limiti di upload agiscono in tre punti: nel server web, in PHP e nell'applicazione. Come impostare i valori in modo coerente, anche con i valori transitori di php.net per PHP2Shell.

Stato 6 min di letturaHardening e configurazione

In breve: post_max_size limita la dimensione complessiva di una richiesta POST, upload_max_filesize il singolo file; secondo il manuale PHP i valori predefiniti sono 8M e 2M. I valori devono essere coerenti con i limiti del server web e dell'applicazione, altrimenti gli upload falliscono senza un messaggio chiaro. Fino all'aggiornamento per PHP2Shell, php.net consiglia post_max_size = 8M senza upload o 32M con upload, upload_max_filesize inferiore, impostati in modo che le applicazioni non li sovrascrivano.

Quando il modulo di candidatura all'improvviso tace

Dopo le misure transitorie per PHP2Shell molti amministratori hanno abbassato post_max_size. Pochi giorni dopo l'ufficio del personale segnala che le candidature non arrivano più. Il modulo si ricarica semplicemente, senza alcun messaggio di errore. Il motivo: la richiesta con tre allegati PDF era più grande del nuovo limite e PHP ha scartato i dati del modulo.

L'esempio mostra il problema di fondo. I limiti di upload agiscono contemporaneamente in più punti, e ogni punto reagisce in modo diverso quando viene superato. Chi conosce la catena può impostare i valori in modo che proteggano senza disturbare l'esercizio. Come PHP elabora internamente gli upload lo spiega Come PHP elabora gli upload di file; la programmazione sicura delle funzioni di upload è descritta in Realizzare in modo sicuro gli upload di file in PHP.

La catena dei limiti di upload

Una richiesta attraversa più limiti prima che l'applicazione la veda. Le indicazioni seguenti provengono dalle documentazioni di Nginx, Apache e PHP:

Punto Impostazione Valore predefinito secondo la doc In caso di superamento
Nginx client_max_body_size 1m errore 413 al browser
Apache da 2.4.54 LimitRequestBody 1 GiB (fino a 2.4.53: illimitato) risposta di errore invece dell'elaborazione
PHP post_max_size 8M $_POST e $_FILES vuoti
PHP upload_max_filesize 2M il file viene rifiutato con un codice di errore
PHP max_file_uploads 20 gli altri file vengono ignorati
PHP max_input_vars 1000 mancano gli altri campi del modulo

Ne deriva una regola semplice: upload_max_filesize minore di post_max_size, post_max_size minore del limite nel server web. Il manuale PHP raccomanda inoltre che memory_limit sia in generale maggiore di post_max_size. Durante la misura transitoria per PHP2Shell con memory_limit=-1, questo ruolo viene assunto dal limite tramite container o cgroup; maggiori informazioni in Impostare correttamente memory_limit.

post_max_size dopo PHP2Shell: cosa consiglia php.net

Nell'avviso di sicurezza del 21/10/2026 php.net indica, per i server senza aggiornamento, limiti bassi per le richieste come una delle misure transitorie. Riducono il rischio di singole vie di attacco, ma espressamente non sono una protezione completa:

  1. Senza upload di file: post_max_size = 8M.
  2. Con upload di file: post_max_size = 32M.
  3. In entrambi i casi: mantenere upload_max_filesize al di sotto di post_max_size.
  4. Valutare inoltre: limiti nel server web o nel proxy per la dimensione decodificata della richiesta, il numero di campi di input, il numero di parti multipart, il numero di righe di intestazione e la profondità di annidamento. Secondo php.net questi limiti devono coprire anche le richieste senza un'indicazione Content-Length utilizzabile.

I valori vanno posti dove le applicazioni non possono sovrascriverli. Poiché secondo il manuale post_max_size e upload_max_filesize sono modificabili a livello di directory, altrimenti un .user.ini o, con mod_php, un .htaccess potrebbe rialzarli:

; Pool FPM del sito, con upload (fase transitoria fino all'aggiornamento)
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 24M
php_admin_value[max_file_uploads] = 5

Nel server web tracci il limite appena sopra, in modo che le richieste troppo grandi non arrivino nemmeno a PHP:

# Nginx, nel blocco server o location
client_max_body_size 32m;
# Apache, nel VirtualHost: 32 MiB in byte
LimitRequestBody 33554432

Poi ricarichi tutti i worker PHP e il server web. Il prospetto di tutte le misure transitorie è in Misure immediate se non può ancora applicare la patch. Se e come le richieste di upload si possano filtrare inoltre sul proxy lo illustra Filtrare le richieste di upload al perimetro.

Importante

Dopo ogni modifica testi i moduli con le richieste legittime più grandi: candidature con più allegati, importazioni di prodotti, gallerie di immagini. Un valore troppo stretto paralizza processi aziendali senza che nessuno veda un messaggio di errore.

Stabilire il valore giusto per il Suo sito

Invece di valori generici, vale la pena di fare un breve inventario. Elenchi tutti i moduli con upload e annoti il file legittimo più grande e il numero massimo di file contemporanei. Ne risulta il fabbisogno: upload_max_filesize copre il singolo file più grande, post_max_size la somma di tutti i file di una richiesta più una piccola riserva per i campi del modulo.

Se il fabbisogno supera 32M, non è compatibile con la raccomandazione transitoria di php.net. È allora un motivo in più per anticipare l'aggiornamento. Gli upload di grandi dimensioni si possono gestire anche tramite un sottodominio dedicato con un pool proprio, in modo che il resto del sito mantenga limiti stretti.

Dopo l'aggiornamento a 8.5.12, 8.4.27, 8.3.36, 8.2.35 o a un backport confermato, può riallineare i valori al fabbisogno effettivo. Non dovrebbero comunque essere più generosi del necessario: ogni limite che eccede il fabbisogno amplia la superficie d'attacco senza utilità. Se un sito non ha bisogno di upload, file_uploads = Off è la soluzione più pulita.

Interpretare correttamente i quadri di errore

Quando gli upload falliscono, il comportamento rivela quale limite sta agendo. Una pagina con errore 413 proviene dal server web. Un modulo che si ricarica senza messaggio o segnala «richiesta non valida» indica dati $_POST vuoti, quindi post_max_size. Un messaggio dell'applicazione su un singolo file corrisponde a upload_max_filesize. E campi mancanti in moduli molto grandi, ad esempio con varianti di prodotto, fanno pensare a max_input_vars. Il log degli errori di PHP contiene di norma, in caso di post_max_size superato, un avviso con la dimensione della richiesta.

Perché gli utenti non restino senza indicazioni, l'applicazione dovrebbe riconoscere il caso. Il manuale PHP propone a tal fine una via semplice: il modulo passa un marcatore nell'indirizzo, ad esempio ?processed=1. Se il marcatore arriva ma $_POST e $_FILES sono vuoti, la richiesta era troppo grande e l'applicazione può mostrare un messaggio comprensibile con la dimensione consentita.

Come aiuta PHP SOS in concreto?

  • Rileviamo tutte le vie di upload dei Suoi siti e stabiliamo le dimensioni realmente necessarie.
  • Impostiamo in modo coerente i limiti di server web, PHP e pool, bloccati contro la sovrascrittura, compresi i valori transitori di php.net.
  • Testiamo moduli, importazioni e upload dopo il passaggio e adattiamo i valori in modo mirato.
  • Nell'ambito dell'hardening del server riportiamo i valori, dopo l'aggiornamento, al fabbisogno permanente.

Domande frequenti

Qual è la differenza tra post_max_size e upload_max_filesize?

upload_max_filesize limita la dimensione di un singolo file caricato. post_max_size limita i dati complessivi di una richiesta POST, cioè tutti i file e i campi del modulo insieme. Secondo il manuale PHP, post_max_size deve quindi essere maggiore di upload_max_filesize.

Che cosa succede se una richiesta è più grande di post_max_size?

Secondo il manuale PHP, $_POST e $_FILES sono allora vuoti. L'applicazione non riceve quindi alcun dato del modulo e spesso mostra solo un messaggio di errore poco chiaro o ricarica il modulo. Questo rende difficile riconoscere l'errore.

Quali valori consiglia php.net a causa di PHP2Shell?

Come misura transitoria fino all'aggiornamento: post_max_size = 8M per le applicazioni senza upload di file, 32M per quelle con upload, e upload_max_filesize inferiore. Secondo php.net non è una protezione completa; solo l'aggiornamento a una versione di PHP corretta chiude le vulnerabilità.

Posso modificare post_max_size con ini_set() nel codice?

No. Secondo il manuale PHP, post_max_size è modificabile solo a livello di directory, ad esempio in php.ini, nel pool FPM, in .user.ini o, con mod_php, in .htaccess. Chi vuole imporre il valore lo imposta con php_admin_value; allora nemmeno un .user.ini può sovrascriverlo.

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