Extra hosszú POST adatok küldése
Sziasztok!
Egy olyan jellegű kérdésem lenne, hogy ha van egy formom és egy jókedvű felhasználó a név mezőhöz (egy program segítségével) egy 7 MB hosszú "nevet" küld, akkor annak milyen következményei lehetnek? Egyáltalán string/array-ként lehet ilyen hosszú adatot küldeni?
Attól tartok, ha ilyen bekövetkezik, akkor jön a hibaüzenet, hogy nincs elég memória, vagy ilyesmi.
Van alapja az aggodalmamnak?
Válaszotokat előre is köszönöm!
Szabolcs
■ Egy olyan jellegű kérdésem lenne, hogy ha van egy formom és egy jókedvű felhasználó a név mezőhöz (egy program segítségével) egy 7 MB hosszú "nevet" küld, akkor annak milyen következményei lehetnek? Egyáltalán string/array-ként lehet ilyen hosszú adatot küldeni?
Attól tartok, ha ilyen bekövetkezik, akkor jön a hibaüzenet, hogy nincs elég memória, vagy ilyesmi.
Van alapja az aggodalmamnak?
Válaszotokat előre is köszönöm!
Szabolcs
konfiguráció
post_max_size
változó szabályozza, hogy maximálisan mekkora adatot lehet POST-olni. Ez hatással van a szkript memória igényére is, mert létre fog jönni egy ekkora méretű változó is (és igen, lehet egy változó mérete 7MB, amennyiben ezzel az alkalmazás nem lépi túl a maximális memória mennyiséget). Ha túllépi ezzel a maximálisan POST-tal küldhető adatmennyiséget akkor a$_POST
illetve$_FILES
globális változók üresek lesznek. http://php.net/manual/en/ini.core.php#ini.post-max-sizeFutásidőben létrehozott változók
memory_limit <= post_max_size <= upload_max_filesize
memory_limit >= post_max_size
Bocsánat!
Tehát akkora fájlt tölthetek fel max, amekkora belefér a memóriába. :-)
Ez olyan, mintha azt mondanám, hogy traktor legyen nagyobb, mint a szántandó föld. :-)
Ez most több kérdést is felvet:
1. Ha feltöltéskor nem töltődik be a fájl a memóriába (aminek nem is látnám értelmét), csak a temp-be, akkor mi értelme a memória méretére korlátozni azt?
2. Ha a (feltöltött anyag mérete + a script memóriában elfoglalt mérete) == max_memory_limit, akkor ha épp létrehozok egy bolhafingnyi változót már leáll a script hibával. Már csak byte-onként kell növelnem az elküldött anyag méretét és sorról-sorra okozhatom a hibákat, amíg valami helyrehozhatatlan hibát nem okozok?
Mert nekem az lenne a normális, ha kicsire vehetném a memóriába bevitt adatok méretét és nagyra a feltölthető fájlok méretét.
Még mindig nem :)
Hogy lett a név mezőből fájl?
1. Egyszerre jön az egész _POST a tempbe, ezért a
post_max_size
. A fájlméret a feldolgozás memóriaigénye (és más okok) miatt külön korlátozható azupload_max_size
-al. A memóriakorlátozás meg azért van, hogy a szkripted ne tudja megenni a szervert (elférjen a traktor a szántóföldön). Mivel ezek a direktívák egymástól függetlenül beállíthatók (php.ini), igen, be lehet állítani hülyeséget is. Akkor is a szigorúbb fog korlátozni. (Pl.post_max_size < upload_max_size
-> hülyeség, mert a képhez még szöveget is akartak postolni.) Nem korlátozza a PHP a feltöltött fájl méretét, hanem feltölti, ha lehet, avagy eldobja. Viszont a feltöltés végeztével a te szkriptednek kell átmozgatnia a temp könyvtárból a végleges helyére, ahhoz viszont memória kell. (Értelmes szerverbeállítás: a szkripted futása után a PHP törli a temp-et. De ez nincs mindenütt így.)2. Az 1-ből kitűnik: amikor a nagy fájllal dolgozol, kell a sok memória. De a
memory_limit
tudtommalini_set()
-el is állítható, csak előbb kell beállítanod, mint felhasználni a nagyobb RAM-ot. Én legalábbis úgy emlékszem, hogy db mentéskor már használtam, meg képműveleteknél is. Olvass utána manual-ban, mert valóban hasznos, ha általában spórolsz a vassal, de fájlkezeléskor kell tudnod "izmosítani".Az átmozgatáshoz speciel nem
Igaz, bocsi, de
Szerintem nem feltétlenül
Ha te írod meg...
A szántóföld még mindig traktor méretű
Értem, hogy POST-ban van a fájl is, de meg tudja különböztetni. Ha fájl, akkor nem tölti be a memóriába, hanem a temp-be rakja. Ez így is van rendjén.
De (!), mi van akkor ha:
1; azt szeretném, hogy a POST adatok max. 200Kb-ot foglalhassanak a memóriában, mert nem akarom, hogy Hekker Józsi küldjön nekem egy 8MB-os textfield-et, amitől kiakasztja a programot, viszont szeretnék akár 500Kb-os képeket is feltölteni.
2; hostolnának nekem egy 100GB-os tárhelyet, ahová a felhasználók filmeket szeretnének feltölteni - nem fog menni nekik, mert nincs elég "memória" a film feltöltéséhez? (Vagy esetleg a post-max-size-ot beállítom 12GB-osra, ami több a memória méreténél és úgy mindenkit kiszolgálok, mert nem csak a felhasználók tudnak 12GB FullHD filmeket feltölteni, de HackerJózsi és csapata is tud 12GB méretű textfieldet küldeni, amit a php azonnal betölt a memóriába.
Szóval ezeket nem értem én mindet. :-)
Egyébként nem tudom, hogy mekkora puffert használ a php egy fájl másolásához, de régen 64Kb elég volt. Nem kellene, hogy sok memóriát egyen, ha igen, akkor +1 issue.
Idézet
1.: A POST-olt űrlapadatokat szerveroldalon ellenőrizd (űrlapmezőnként), így karakterre pontosan tudod korlátozni pl. a texteket. De sok más dolgot is ellenőrizhetsz (pl. mime type, fájlméret), a direktívákat meg állítsd olyan nagyra, hogy ha az összes adat maxi, akkor is kényelmesen beférjen (kicsit rászámolhatsz, ha pl. a textet levágni akarod, nem eldobni a teljes POST-ot).
2.: Mint 1-ben, ne mindent php.ini-ben akarj megoldani. Van egy-két dolog (pl. memory_limit), amit szkripten pelül is tudsz állítani, de egy csomót csak php.ini-ből, ezek a beállítások az egész site-ra érvényesek lesznek. De más okokból is (XSS, stb.) fontos a feldolgozáskori szűrés, ezek a méretdolgok könnyűek. Szóval próbáld ki úgy, hogy csak a post_max_size és az upload_max_filesize értékét állítod elég nagyra, majd meglátod, hogy műxik-e. Javaslom, hogy teszt alatt mérdd a memóriát.
Szerk.: fontos még a feltöltési idő, szkript futásidő is. Ha csinálsz méréseket, megoszthatnád.
Én csak azt írtam, hogy
A feltöltés esetén természetesen szükség van a memóriára, igaz, ilyenkor is lehet részenként fogadni és azonnal lemezre írni.
Jogos,