Na kratko: post_max_size omejuje skupno velikost zahteve POST, upload_max_filesize posamezno datoteko; privzeto sta po priročniku PHP 8M in 2M. Vrednosti morajo ustrezati mejam v spletnem strežniku in aplikaciji, sicer nalaganja odpovedo brez jasnega sporočila. Do posodobitve za PHP2Shell php.net svetuje post_max_size = 8M brez nalaganj ali 32M z nalaganji, upload_max_filesize pod tem, nastavljeno tako, da ga aplikacije ne morejo prepisati.
Ko obrazec za prijave nenadoma molči
Po prehodnih ukrepih za PHP2Shell so številni skrbniki znižali post_max_size. Nekaj dni pozneje kadrovska služba sporoči, da prijave ne prihajajo več. Obrazec se preprosto znova naloži, sporočila o napaki ni. Vzrok: zahteva s tremi priponkami PDF je bila večja od nove meje in PHP je podatke obrazca zavrgel.
Primer kaže osnovno težavo. Meje nalaganja delujejo na več mestih hkrati in vsako mesto se odzove drugače, ko je prekoračeno. Kdor pozna verigo, lahko vrednosti nastavi tako, da ščitijo, ne da bi motile delovanje. Kako PHP nalaganja obdeluje notranje, pojasnjuje Kako PHP obdeluje nalaganje datotek; varno programiranje funkcij nalaganja opisuje Varna izvedba nalaganja datotek v PHP.
Veriga meja nalaganja
Zahteva preide več meja, preden jo aplikacija vidi. Naslednji podatki izvirajo iz dokumentacij Nginx, Apache in PHP:
| Mesto | Nastavitev | Privzeto po dokumentaciji | Ob prekoračitvi |
|---|---|---|---|
| Nginx | client_max_body_size |
1m | napaka 413 v brskalnik |
| Apache od 2.4.54 | LimitRequestBody |
1 GiB (do 2.4.53: neomejeno) | odgovor z napako namesto obdelave |
| PHP | post_max_size |
8M | $_POST in $_FILES prazna |
| PHP | upload_max_filesize |
2M | datoteka zavrnjena s kodo napake |
| PHP | max_file_uploads |
20 | nadaljnje datoteke se prezrejo |
| PHP | max_input_vars |
1000 | nadaljnja polja obrazca manjkajo |
Iz tega izhaja preprosto pravilo: upload_max_filesize manjši od post_max_size, post_max_size manjši od meje v spletnem strežniku. Priročnik PHP poleg tega priporoča, da je memory_limit na splošno večji od post_max_size. Med prehodnim ukrepom PHP2Shell z memory_limit=-1 to vlogo prevzame meja prek vsebnika ali cgroup; več o tem pod Pravilna nastavitev memory_limit.
post_max_size po PHP2Shell: kaj svetuje php.net
V varnostnem obvestilu z dne 21. 10. 2026 php.net za strežnike brez posodobitve med prehodne ukrepe uvršča nizke meje zahtev. Zmanjšajo tveganje posameznih poti napada, vendar izrecno niso popolna zaščita:
- Brez nalaganja datotek:
post_max_size = 8M. - Z nalaganjem datotek:
post_max_size = 32M. - V obeh primerih:
upload_max_filesizeohranite podpost_max_size. - Dodatno razmislite o: mejah v spletnem strežniku ali proxyju za dekodirano velikost zahteve, število vnosnih polj, število delov multipart, število glav in globino gnezdenja. Po php.net morajo te meje zajeti tudi zahteve brez uporabne navedbe
Content-Length.
Vrednosti sodijo tja, kjer jih aplikacije ne morejo prepisati. Ker je post_max_size in upload_max_filesize po priročniku mogoče spreminjati na ravni imenika, bi ju sicer .user.ini ali pri mod_php .htaccess lahko znova zvišala:
; Pool FPM spletne strani, z nalaganji (prehod do posodobitve)
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 24M
php_admin_value[max_file_uploads] = 5
V spletnem strežniku mejo potegnete tik nad tem, da prevelike zahteve sploh ne pridejo do PHP:
# Nginx, v bloku server ali location
client_max_body_size 32m;
# Apache, v VirtualHost: 32 MiB v bajtih
LimitRequestBody 33554432
Nato znova naložite vse delavce PHP in spletni strežnik. Pregled vseh prehodnih ukrepov je pod Takojšnji ukrepi, če popravka še ne morete namestiti. Ali in kako je mogoče zahteve za nalaganje dodatno filtrirati na proxyju, osvetljuje Filtriranje zahtev za nalaganje na robu.
Po vsaki spremembi preizkusite obrazce z največjimi legitimnimi zahtevami: prijave z več priponkami, uvozi izdelkov, galerije slik. Premajhna vrednost ohromi poslovne procese, ne da bi kdo videl sporočilo o napaki.
Določanje prave vrednosti za vašo spletno stran
Namesto splošnih vrednosti se splača kratka inventura. Naštejte vse obrazce z nalaganji in zabeležite največjo legitimno datoteko in največje število hkratnih datotek. Iz tega izhaja potreba: upload_max_filesize pokrije največjo posamezno datoteko, post_max_size vsoto vseh datotek zahteve plus nekaj rezerve za polja obrazca.
Če potreba presega 32M, ne ustreza prehodnemu priporočilu php.net. To je potem še en razlog, da posodobitev izvedete prej. Velika nalaganja je mogoče obdelovati tudi prek lastne poddomene z lastnim poolom, da preostala spletna stran ohrani ozke meje.
Po posodobitvi na 8.5.12, 8.4.27, 8.3.36, 8.2.35 ali potrjen backport lahko vrednosti spet uskladite z dejansko potrebo. Vseeno naj ne bodo radodarnejše od potrebnega: vsaka meja, ki presega potrebo, brez koristi povečuje napadalno površino. Če spletna stran nalaganj sploh ne potrebuje, je file_uploads = Off najčistejša rešitev.
Pravilno razlaganje slik napak
Ko nalaganja odpovedo, obnašanje pokaže, katera meja deluje. Stran z napako 413 izvira iz spletnega strežnika. Obrazec, ki se brez sporočila znova naloži ali javi »neveljavna zahteva«, kaže na prazne podatke $_POST, torej post_max_size. Sporočilo aplikacije o posamezni datoteki ustreza upload_max_filesize. Manjkajoča polja v zelo velikih obrazcih, na primer pri različicah izdelkov, govorijo za max_input_vars. Dnevnik napak PHP ob prekoračenem post_max_size praviloma vsebuje opozorilo z velikostjo zahteve.
Da uporabniki ne ostanejo brez pomoči, naj aplikacija ta primer prepozna. Priročnik PHP za to predlaga preprosto pot: obrazec v naslovu posreduje oznako, na primer ?processed=1. Če oznaka prispe, $_POST in $_FILES pa sta prazna, je bila zahteva prevelika in aplikacija lahko prikaže razumljivo sporočilo z dovoljeno velikostjo.
Kako PHP SOS pomaga konkretno?
- Zajamemo vse poti nalaganja vaših spletnih strani in ugotovimo dejansko potrebne velikosti.
- Meje spletnega strežnika, PHP in poolov nastavimo usklajeno in zaklenjeno pred prepisovanjem, vključno s prehodnimi vrednostmi php.net.
- Po prehodu preizkusimo obrazce, uvoze in nalaganja ter vrednosti ciljno prilagodimo.
- V okviru utrjevanja strežnikov vrednosti po posodobitvi vrnemo na trajno potrebo.
Pogosta vprašanja
Kakšna je razlika med post_max_size in upload_max_filesize?
upload_max_filesize omejuje velikost ene naložene datoteke. post_max_size omejuje skupne podatke zahteve POST, torej vse datoteke in polja obrazca skupaj. Po priročniku PHP mora biti post_max_size zato večji od upload_max_filesize.
Kaj se zgodi, če je zahteva večja od post_max_size?
Po priročniku PHP sta $_POST in $_FILES takrat prazna. Aplikacija torej sploh ne prejme podatkov obrazca in pogosto prikaže samo nejasno sporočilo o napaki ali znova naloži obrazec. Zaradi tega je to napako težko prepoznati.
Katere vrednosti php.net priporoča zaradi PHP2Shell?
Kot prehodni ukrep do posodobitve: post_max_size = 8M za aplikacije brez nalaganja datotek, 32M za aplikacije z nalaganjem, upload_max_filesize pa pod tem. Po php.net to ni popolna zaščita; ranljivosti zapre samo posodobitev na popravljeno različico PHP.
Ali lahko post_max_size v kodi spremenim z ini_set()?
Ne. Po priročniku PHP je post_max_size mogoče spreminjati samo na ravni imenika, na primer v php.ini, v poolu FPM, v .user.ini ali pri mod_php v .htaccess. Kdor želi vrednost prisiliti, jo nastavi s php_admin_value, tedaj je ne more prepisati niti .user.ini.