Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

Smiselna omejitev post_max_size in upload_max_filesize

Meje nalaganja delujejo na treh mestih: v spletnem strežniku, v PHP in v aplikaciji. Tako vrednosti nastavite usklajeno, tudi s prehodnimi vrednostmi php.net za PHP2Shell.

Stanje 5 min branjaUtrjevanje in konfiguracija

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:

  1. Brez nalaganja datotek: post_max_size = 8M.
  2. Z nalaganjem datotek: post_max_size = 32M.
  3. V obeh primerih: upload_max_filesize ohranite pod post_max_size.
  4. 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.

Pomembno

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.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč