Go achomair: Nuair a uaslódálann brabhsálaí comhad, seolann sé iarratas POST san fhormáid multipart/form-data, ina bhfuil réimsí foirme agus ábhar comhad ina gcodanna ar leith, ceann i ndiaidh a chéile. Briseann PHP an t-iarratas seo as a stuaim féin, scríobhann sé gach cuid comhaid i gcomhad sealadach in upload_tmp_dir, cuireann sé na sonraí isteach i $_FILES agus ansin amháin tosaíonn sé do script. Aistríonn an script an comhad le move_uploaded_file(); scriosann PHP gach rud nár aistríodh ag deireadh an iarratais.
Conair comhaid ón mbrabhsálaí go dtí an script
Do lucht cinnteoireachta is é seo an rud is tábhachtaí: ní próiseas den fheidhmchlár amháin é uaslódáil. Tarlaíonn cuid mhór den obair san ateangaire PHP sula mbíonn cód an CMS nó an tsiopa páirteach ar chor ar bith. Dá bhrí sin bíonn tionchar ag earráidí sa chuid seo de PHP ar gach suíomh gréasáin, cibé an bhfuil foirm uaslódála aige nó nach bhfuil.
An sreabhadh i mbeagán focal:
- Seoltar an fhoirm le
method="POST"agusenctype="multipart/form-data". - Glacann an freastalaí gréasáin leis an iarratas agus seolann sé ar aghaidh chuig PHP é, de réir an mhodha oibriúcháin trí PHP-FPM, mod_php nó comhéadan eile.
- Seiceálann PHP teorainneacha ar nós
post_max_sizeagus briseann sé an t-ábhar síos de réir teaghráin deighilteora, an Boundary mar a thugtar air. - Téann gnáthréimsí isteach i
$_POST; scríobhtar codanna comhaid i gcomhaid shealadacha agus déantar cur síos orthu i$_FILES. - Anois amháin tosaíonn an script, seiceálann sé an comhad agus aistríonn sé chuig a cheann scríbe é.
- Ag deireadh an iarratais scriosann PHP na comhaid shealadacha go léir nár aistríodh.
multipart/form-data: struchtúr iarratais uaslódála
Is téacs glan é iarratas uaslódála le sonraí comhaid leabaithe. Ainmníonn an ceanntásc Content-Type an Boundary, agus san ábhar scarann an teaghrán seo na codanna ó chéile. Tá a gceanntásca féin ag gach cuid, le hainm réimse agus, más infheidhme, ainm comhaid. Sampla an-ghearr, neamhdhíobhálach:
POST /bewerbung HTTP/1.1
Content-Type: multipart/form-data; boundary=----trenner42
------trenner42
Content-Disposition: form-data; name="vorname"
Erika
------trenner42
Content-Disposition: form-data; name="lebenslauf"; filename="lebenslauf.pdf"
Content-Type: application/pdf
%PDF-1.7 ... Dateiinhalt ...
------trenner42--
Is ón seoltóir a thagann gach sonra sa téacs seo, ainm an chomhaid agus Content-Type na coda san áireamh. Glacann PHP leo isteach i $_FILES, ach ní sheiceálann sé an bhfuil siad inchreidte.
An t-eagar $_FILES
I gcás réimse darb ainm lebenslauf, tá na heochracha seo i $_FILES['lebenslauf'] de réir lámhleabhar PHP:
| Eochair | Ábhar | An bhfuil muinín ann? |
|---|---|---|
name |
ainm bunaidh an chomhaid ag an seoltóir | níl |
full_path |
cosán a thuairiscigh an brabhsálaí, ó PHP 8.1.0 i leith | níl |
type |
cineál MIME de réir an bhrabhsálaí, gan seiceáil ag PHP | níl |
size |
méid i mbearta | cinnte ag PHP |
tmp_name |
cosán an chomhaid shealadaigh ar an bhfreastalaí | sannta ag PHP |
error |
cód earráide na próiseála uaslódála | socraithe ag PHP |
I gcás réimsí le lúibíní cearnacha san ainm, mar shampla bilder[], tá eagar i ngach eochair le hiontráil amháin do gach comhad. Téann an feidhmchlár tríd, mar shampla, $_FILES['bilder']['error'] agus faigheann sé rochtain ar tmp_name agus name leis an innéacs céanna.
Is féidir le foirm réimse folaithe MAX_FILE_SIZE a sheoladh roimh an réimse comhaid freisin. De réir an lámhleabhair, is leid don bhrabhsálaí é sin amháin, a sheachnaítear go héasca. Ní féidir brath ach ar na teorainneacha a fhorfheidhmíonn an freastalaí: i PHP, sa fhreastalaí gréasáin agus sa fheidhmchlár féin.
Teorainneacha: treoracha php.ini d'uaslódálacha
Rialaíonn na treoracha seo próiseáil uaslódálacha. Tagann na luachanna réamhshocraithe ó lámhleabhar PHP agus is iad atá i bhfeidhm mura sáraíonn php.ini iad.
| Treoir | Réamhshocrú | Inathraithe in |
|---|---|---|
file_uploads |
1 |
cumraíocht an chórais amháin |
upload_tmp_dir |
folamh (temp an chórais) | cumraíocht an chórais amháin |
upload_max_filesize |
2M |
php.ini, linn, cumraíocht eolaire |
post_max_size |
8M |
php.ini, linn, cumraíocht eolaire |
max_file_uploads |
20 |
php.ini, linn, cumraíocht eolaire |
enable_post_data_reading |
1 |
php.ini, linn, cumraíocht eolaire |
Ní mór post_max_size a bheith níos mó ná upload_max_filesize, agus de réir an lámhleabhair ba cheart memory_limit a bheith níos mó ná post_max_size de ghnáth. Mura bhfuil upload_tmp_dir inscríofa, aistríonn PHP go dtí eolaire temp an chórais. Le open_basedir ní mór an t-eolaire temp a cheadú, nó teipeann ar uaslódálacha. Déanann an t-alt post_max_size agus upload_max_filesize a theorannú go ciallmhar cur síos ar luachanna praiticiúla agus ar a n-iarmhairtí.
Cóid earráide a mheas i gceart
Insíonn an réimse error cad a tharla le linn na próiseála. Téann na tairisigh ó UPLOAD_ERR_OK (0) trí UPLOAD_ERR_INI_SIZE (1), UPLOAD_ERR_FORM_SIZE (2), UPLOAD_ERR_PARTIAL (3) agus UPLOAD_ERR_NO_FILE (4) go UPLOAD_ERR_NO_TMP_DIR (6), UPLOAD_ERR_CANT_WRITE (7) agus UPLOAD_ERR_EXTENSION (8).
<?php
declare(strict_types=1);
$datei = $_FILES['lebenslauf'] ?? null;
if ($datei === null) {
exit('Keine Upload-Daten, eventuell wurde post_max_size überschritten.');
}
$meldung = match ($datei['error']) {
UPLOAD_ERR_OK => null,
UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE => 'Datei zu groß.',
UPLOAD_ERR_NO_FILE => 'Keine Datei gewählt.',
default => 'Upload fehlgeschlagen.',
};
if ($meldung === null && is_uploaded_file($datei['tmp_name'])) {
$ziel = '/srv/app/uploads/' . bin2hex(random_bytes(16)) . '.pdf';
move_uploaded_file($datei['tmp_name'], $ziel);
}
Ní léiríonn an sampla ach an mheicníocht. Déanann an treoir Uaslódálacha comhad a chur i bhfeidhm go sábháilte i PHP cur síos ar sheiceáil chineál an chomhaid, stóráil lasmuigh den Webroot agus rith scripteanna a bhac.
Uaslódálacha agus PHP2Shell: cad is brí leis na bearta idirthréimhseacha
Bíonn tionchar ag leochaileachtaí PHP2Shell CVE-2026-109618 agus CVE-2026-109619 ar an bpróiseáil timpeall an iarratais san ateangaire PHP. Dá bhrí sin luann php.net mar bhearta idirthréimhseacha, i measc nithe eile, post_max_size = 8M (gan uaslódálacha) nó 32M (le huaslódálacha), upload_max_filesize faoina bhun, chomh maith le session.upload_progress.enabled=0. Is in php.ini, i linn FPM nó i gcumraíocht an fhreastalaí a bhaineann na luachanna seo, agus ina dhiaidh sin ní mór gach oibrí a atosú.
Molann údair theicniúla freisin iarratais multipart/form-data a bhlocáil ag an seachfhreastalaí nó sa WAF lasmuigh de chosáin uaslódála fíora. Is beart neamhoifigiúil é sin agus is é an riosca go mbristear foirmeacha; déanann an t-alt Iarratais uaslódála a scagadh ag an imeall cur síos ar an gcomhbhách. Ní thagann aon cheann de na bearta seo in ionad an nuashonraithe go PHP 8.5.12, 8.4.27, 8.3.36 nó 8.2.35.
Conas a chabhraíonn PHP SOS go praiticiúil?
- Faighimid amach cé acu de do shuíomhanna gréasáin a dteastaíonn uaslódálacha uathu i ndáiríre agus ar cé na cosáin.
- Socraímid na teorainneacha agus na bearta idirthréimhseacha do gach linn, atosaímid gach oibrí agus déanaimid tástáil ar na foirmeacha.
- Seiceálaimid eolairí uaslódála le haghaidh comhad inrite agus cuirimid cosc ar rith scripteanna mar chuid de chruatú freastalaí.
- Suiteálaimid an nuashonrú PHP agus déanaimid staid an phaistithe a dhoiciméadú do gach suíomh gréasáin.
Ceisteanna coitianta
Cá stórálann PHP comhaid uaslódáilte ar dtús?
I eolaire sealadach. De réir réamhshocraithe is é sin eolaire sealadach an chórais; is féidir é a athrú le upload_tmp_dir. Mura n-aistrítear an comhad sa script, scriosann PHP é ag deireadh an iarratais.
An bhfuil muinín agam as an réimse type i $_FILES?
Níl. Is é an brabhsálaí a thuairiscíonn an cineál MIME, agus de réir an lámhleabhair ní sheiceálann PHP é. Is ón seoltóir freisin a thagann name agus full_path. Faigh amach an cineál comhaid iarbhír ar an taobh freastalaí, ar bhonn an ábhair.
Cén fáth a bhfuil $_FILES folamh cé gur seoladh comhad?
Is dócha go raibh an t-iarratas iomlán níos mó ná post_max_size. Ansin folmhaíonn PHP $_POST agus $_FILES go hiomlán, gan cód earráide san eagar. Is cúiseanna eile iad enctype in easnamh sa fhoirm nó file_uploads a bheith múchta.
An gcabhraíonn sé i gcoinne PHP2Shell uaslódálacha a thoirmeasc sa fheidhmchlár?
Ní chabhraíonn. Tarlaíonn próiseáil shonraí an iarratais i PHP sula ritheann cód an fheidhmchláir. Is éifeachtach an nuashonrú PHP agus atosú gach oibrí; ní bheart idirthréimhseach iad teorainneacha níos docht ach sin amháin.
Cad é an difríocht idir upload_max_filesize agus post_max_size?
Cuireann upload_max_filesize teorainn le gach comhad ar leith, post_max_size le hábhar iomlán an iarratais, gach comhad agus réimse san áireamh. Dá bhrí sin ní mór post_max_size a bheith níos mó ná upload_max_filesize.