Situația actuală: PHP2Shell. Două vulnerabilități critice PHP (CVSS 9.2) permit cod malițios fără autentificare. Patchuri din 21.10.2026.Ce este de făcut acum →

Limitarea rezonabilă a post_max_size și upload_max_filesize

Limitele de upload acționează în trei locuri: în serverul web, în PHP și în aplicație. Cum stabiliți valorile coerent, inclusiv cu valorile provizorii de la php.net pentru PHP2Shell.

Stadiu 5 min de cititSecurizare și configurare

Pe scurt: post_max_size limitează dimensiunea totală a unei cereri POST, upload_max_filesize fișierul individual; potrivit manualului PHP, valorile implicite sunt 8M și 2M. Valorile trebuie să se potrivească cu limitele din serverul web și din aplicație, altfel încărcările eșuează fără mesaj clar. Până la actualizarea PHP2Shell, php.net recomandă post_max_size = 8M fără încărcări sau 32M cu încărcări, upload_max_filesize sub acestea, stabilite astfel încât aplicațiile să nu le suprascrie.

Când formularul de candidatură tace brusc

După măsurile provizorii pentru PHP2Shell, mulți administratori au redus post_max_size. Câteva zile mai târziu, departamentul de resurse umane raportează că nu mai ajung candidaturile. Formularul pur și simplu se reîncarcă, fără niciun mesaj de eroare. Motivul: cererea cu trei atașamente PDF a fost mai mare decât noua limită, iar PHP a eliminat datele formularului.

Exemplul arată problema de fond. Limitele de upload acționează simultan în mai multe locuri, iar fiecare loc reacționează diferit când este depășit. Cine cunoaște lanțul poate stabili valorile astfel încât să protejeze fără a perturba activitatea. Cum procesează PHP intern încărcările explică Cum procesează PHP încărcările de fișiere; programarea sigură a funcțiilor de upload o descrie Implementarea sigură a încărcărilor de fișiere în PHP.

Lanțul limitelor de upload

O cerere trece prin mai multe limite înainte ca aplicația să o vadă. Datele următoare provin din documentațiile Nginx, Apache și PHP:

Loc Setare Valoare implicită conform documentației La depășire
Nginx client_max_body_size 1m eroarea 413 către browser
Apache de la 2.4.54 LimitRequestBody 1 GiB (până la 2.4.53: nelimitat) răspuns de eroare în loc de prelucrare
PHP post_max_size 8M $_POST și $_FILES goale
PHP upload_max_filesize 2M fișierul este respins cu un cod de eroare
PHP max_file_uploads 20 fișierele suplimentare sunt ignorate
PHP max_input_vars 1000 câmpurile de formular suplimentare lipsesc

De aici rezultă o regulă simplă: upload_max_filesize mai mic decât post_max_size, post_max_size mai mic decât limita din serverul web. Manualul PHP recomandă, în plus, ca memory_limit să fie, în general, mai mare decât post_max_size. În timpul măsurii provizorii PHP2Shell cu memory_limit=-1, acest rol îl preia limita prin container sau cgroup; mai multe la Setarea corectă a memory_limit.

post_max_size după PHP2Shell: ce recomandă php.net

În anunțul de securitate din 21.10.2026, php.net indică, pentru serverele fără actualizare, limite scăzute ale cererilor drept una dintre măsurile provizorii. Ele reduc riscul unor căi de atac individuale, dar nu sunt în mod explicit o protecție completă:

  1. Fără încărcări de fișiere: post_max_size = 8M.
  2. Cu încărcări de fișiere: post_max_size = 32M.
  3. În ambele cazuri: păstrați upload_max_filesize sub post_max_size.
  4. Luați în considerare suplimentar: limite în serverul web sau în proxy pentru dimensiunea decodată a cererii, numărul câmpurilor de intrare, numărul părților multipart, numărul liniilor de antet și adâncimea de imbricare. Potrivit php.net, aceste limite trebuie să cuprindă și cererile fără o indicație utilizabilă Content-Length.

Valorile aparțin unde aplicațiile nu le pot suprascrie. Deoarece, potrivit manualului, post_max_size și upload_max_filesize pot fi modificate la nivel de director, un .user.ini sau, la mod_php, un .htaccess le-ar putea ridica din nou:

; Pool-ul FPM al site-ului, cu încărcări (tranziție până la actualizare)
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 24M
php_admin_value[max_file_uploads] = 5

În serverul web trageți limita puțin mai sus, pentru ca cererile prea mari să nu mai ajungă deloc la PHP:

# Nginx, în blocul server sau location
client_max_body_size 32m;
# Apache, în VirtualHost: 32 MiB în octeți
LimitRequestBody 33554432

Apoi reîncărcați toți workerii PHP și serverul web. Prezentarea tuturor măsurilor provizorii se află la Măsuri imediate dacă nu puteți încă aplica patchul. Dacă și cum pot fi filtrate suplimentar cererile de upload la proxy analizează Filtrarea cererilor de upload la margine.

Important

După fiecare modificare, testați formularele cu cele mai mari cereri legitime: candidaturi cu mai multe atașamente, importuri de produse, galerii de imagini. O valoare prea strânsă paralizează procese de afaceri, fără ca cineva să vadă un mesaj de eroare.

Stabilirea valorii potrivite pentru site-ul dumneavoastră

În locul unor valori generale merită o scurtă inventariere. Listați toate formularele cu încărcări și notați cel mai mare fișier legitim și cel mai mare număr de fișiere simultane. De aici rezultă necesarul: upload_max_filesize acoperă cel mai mare fișier individual, post_max_size suma tuturor fișierelor unei cereri plus o mică rezervă pentru câmpurile de formular.

Dacă necesarul depășește 32M, el nu se potrivește cu recomandarea provizorie de la php.net. Atunci este un motiv în plus de a devansa actualizarea. Încărcările mari pot fi tratate și printr-un subdomeniu propriu, cu pool propriu, pentru ca restul site-ului să păstreze limite strânse.

După actualizarea la 8.5.12, 8.4.27, 8.3.36, 8.2.35 sau la un backport confirmat, puteți alinia din nou valorile la necesarul real. Totuși, ele nu ar trebui să fie mai generoase decât este nevoie: orice limită care depășește necesarul mărește suprafața de atac fără beneficiu. Dacă un site nu are nevoie deloc de încărcări, file_uploads = Off este cea mai curată soluție.

Interpretarea corectă a tiparelor de erori

Când încărcările eșuează, comportamentul trădează care limită se aplică. O pagină cu eroarea 413 provine de la serverul web. Un formular care se reîncarcă fără mesaj sau raportează „cerere nevalidă” indică date $_POST goale, deci post_max_size. Un mesaj al aplicației despre un singur fișier se potrivește cu upload_max_filesize. Iar câmpurile lipsă în formulare foarte mari, de exemplu la variante de produs, indică max_input_vars. Jurnalul de erori PHP conține, de regulă, la depășirea post_max_size, un avertisment cu dimensiunea cererii.

Pentru ca utilizatorii să nu rămână descumpăniți, aplicația ar trebui să recunoască acest caz. Manualul PHP sugerează în acest scop o cale simplă: formularul transmite un marker în adresă, de exemplu ?processed=1. Dacă markerul ajunge, dar $_POST și $_FILES sunt goale, cererea a fost prea mare, iar aplicația poate afișa un mesaj ușor de înțeles, cu dimensiunea admisă.

Cum ajută PHP SOS concret?

  • Inventariem toate căile de upload ale site-urilor dumneavoastră și stabilim dimensiunile necesare în realitate.
  • Stabilim coerent limitele serverului web, ale PHP și ale pool-ului, blocate împotriva suprascrierii, inclusiv valorile provizorii de la php.net.
  • Testăm formularele, importurile și încărcările după trecere și ajustăm țintit valorile.
  • În cadrul securizării serverului readucem valorile, după actualizare, la necesarul permanent.

Întrebări frecvente

Care este diferența dintre post_max_size și upload_max_filesize?

upload_max_filesize limitează dimensiunea unui singur fișier încărcat. post_max_size limitează totalul datelor unei cereri POST, deci toate fișierele și câmpurile de formular la un loc. Potrivit manualului PHP, post_max_size trebuie de aceea să fie mai mare decât upload_max_filesize.

Ce se întâmplă dacă o cerere este mai mare decât post_max_size?

Potrivit manualului PHP, $_POST și $_FILES sunt atunci goale. Aplicația nu primește deci deloc datele formularului și afișează adesea doar un mesaj de eroare neclar sau reîncarcă formularul. Aceasta face eroarea greu de recunoscut.

Ce valori recomandă php.net din cauza PHP2Shell?

Ca măsură provizorie până la actualizare: post_max_size = 8M pentru aplicații fără încărcări de fișiere, 32M pentru aplicații cu încărcări, iar upload_max_filesize sub aceste valori. Potrivit php.net, aceasta nu este o protecție completă; doar actualizarea la o versiune PHP corectată închide vulnerabilitățile.

Pot modifica post_max_size prin ini_set() în cod?

Nu. Potrivit manualului PHP, post_max_size poate fi modificat doar la nivel de director, de exemplu în php.ini, în pool-ul FPM, în .user.ini sau, la mod_php, în .htaccess. Cine vrea să impună valoarea o stabilește cu php_admin_value; atunci nici un .user.ini nu o poate suprascrie.

Surse

Contact imediat

Fiecare oră contează. Scrieți-ne acum.

Descrieți pe scurt sistemul, versiunea PHP și ce ați observat. Ne vom face auziți, clarificăm situația și lucrăm la distanță până când incidentul este încheiat și documentat.

Ajutor imediat