Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Kif PHP jipproċessa l-uploads tal-fajls

Bejn il-klikk fuq it-tlugħ tal-fajl u l-kodiċi tagħkom hemm sensiela sħiħa ta' pproċessar f'PHP. Din il-paġna tispjega multipart/form-data, fajls temporanji, $_FILES, limiti u r-rabta ma' PHP2Shell.

Stat 5 min. qariGħarfien dwar PHP

Fil-qosor: Meta browser jgħabbi fajl, jibgħat talba POST fil-format multipart/form-data, fejn l-oqsma tal-formola u l-kontenut tal-fajls jidhru bħala partijiet separati wara xulxin. PHP innifsu jaqsam din it-talba, jikteb kull parti ta' fajl f'fajl temporanju fl-upload_tmp_dir, jniżżel id-dettalji f'$_FILES u biss imbagħad jibda l-iskript tagħkom. L-iskript iċaqlaq il-fajl b'move_uploaded_file(); dak kollu li ma jiġix mċaqlaq, PHP ineħħih fi tmiem it-talba.

It-triq ta' fajl mill-browser sal-iskript

Għal min jieħu d-deċiżjonijiet, l-aktar importanti hu dan: upload mhuwiex proċess tal-applikazzjoni biss. Parti kbira mix-xogħol isir fl-interpretatur ta' PHP, qabel ma l-kodiċi taċ-CMS jew tal-ħanut ikun involut xejn. Għalhekk żbalji f'din il-parti ta' PHP jolqtu kull websajt, kemm jekk għandha formola għat-tlugħ ta' fajls kif ukoll jekk le.

Il-fluss fil-qosor:

  1. Tintbagħat il-formola b'method="POST" u enctype="multipart/form-data".
  2. Is-server tal-web jaċċetta t-talba u jgħaddiha lil PHP, skont il-modalità tat-tħaddim permezz ta' PHP-FPM, mod_php jew interface oħra.
  3. PHP jiċċekkja limiti bħal post_max_size u jaqsam il-kontenut skont sekwenza ta' karattri li taqsam il-partijiet, imsejħa boundary.
  4. L-oqsma normali jispiċċaw f'$_POST, il-partijiet tal-fajls jinkitbu f'fajls temporanji u jiġu deskritti f'$_FILES.
  5. Biss issa jibda l-iskript, jiċċekkja l-fajl u jċaqlaqh lejn id-destinazzjoni tiegħu.
  6. Fi tmiem it-talba PHP ineħħi l-fajls temporanji kollha li ma ġewx mċaqalqa.

multipart/form-data: l-istruttura ta' talba ta' upload

Talba ta' upload hija test pur b'data tal-fajls inkorporata. L-header Content-Type isemmi l-boundary, u fil-kontenut din is-sekwenza ta' karattri taqsam il-partijiet individwali. Kull parti għandha l-headers tagħha b'isem il-qasam u, jekk applikabbli, isem il-fajl. Eżempju qasir ħafna u bla ħsara:

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--

L-informazzjoni kollha f'dan it-test tiġi minn min jibgħat, inkluż l-isem tal-fajl u l-Content-Type tal-parti. PHP jaqbadha f'$_FILES imma ma jivverifikax jekk hix plawżibbli.

L-array $_FILES

Għal qasam bl-isem lebenslauf, $_FILES['lebenslauf'] fih, skont il-manwal ta' PHP, dawn iċ-ċwievet:

Ċavetta Kontenut Affidabbli?
name l-isem oriġinali tal-fajl għand min jibgħat le
full_path il-mogħdija rrapportata mill-browser, minn PHP 8.1.0 le
type tip MIME skont il-browser, mhux ivverifikat minn PHP le
size daqs f'bytes determinat minn PHP
tmp_name mogħdija tal-fajl temporanju fuq is-server assenjata minn PHP
error kodiċi ta' żball tal-ipproċessar tal-upload issettjat minn PHP

Fil-każ ta' oqsma b'parentesi kwadri fl-isem, pereżempju bilder[], kull ċavetta fiha array b'entrata waħda għal kull fajl. L-applikazzjoni mbagħad tgħaddi pereżempju minn $_FILES['bilder']['error'] u tasal permezz tal-istess indiċi għal tmp_name u name.

Formola tista' tibgħat ukoll qasam moħbi MAX_FILE_SIZE qabel il-qasam tal-fajl. Skont il-manwal dan huwa biss suġġeriment għall-browser, li jista' jiġi evitat faċilment. Tistgħu tiddependu biss fuq il-limiti li jinfurzaw is-server: f'PHP, fis-server tal-web u fl-applikazzjoni nnifisha.

Limiti: id-direttivi ta' php.ini għall-uploads

Dawn id-direttivi jikkontrollaw l-ipproċessar tal-uploads. Il-valuri standard ġejjin mill-manwal ta' PHP u japplikaw meta ebda php.ini ma jissostitwihom.

Direttiva Standard Tista' tinbidel f'
file_uploads 1 konfigurazzjoni tas-sistema biss
upload_tmp_dir vojt (temp tas-sistema) konfigurazzjoni tas-sistema biss
upload_max_filesize 2M php.ini, pool, konfigurazzjoni tad-direttorju
post_max_size 8M php.ini, pool, konfigurazzjoni tad-direttorju
max_file_uploads 20 php.ini, pool, konfigurazzjoni tad-direttorju
enable_post_data_reading 1 php.ini, pool, konfigurazzjoni tad-direttorju

post_max_size irid ikun akbar minn upload_max_filesize, u memory_limit għandu, skont il-manwal, ġeneralment ikun akbar minn post_max_size. Jekk upload_tmp_dir ma jistax jinkiteb, PHP jaqleb għad-direttorju temp tas-sistema. B'open_basedir id-direttorju temp irid ikun permess, inkella l-uploads jfallu. Valuri prattiċi u l-konsegwenzi tagħhom jiddeskrivihom l-artikolu Kif tillimitaw post_max_size u upload_max_filesize b'mod raġonevoli.

Evalwazzjoni korretta tal-kodiċijiet tal-iżbalji

L-qasam error jgħid x'ġara waqt l-ipproċessar. Il-kostanti jvarjaw minn UPLOAD_ERR_OK (0) permezz ta' UPLOAD_ERR_INI_SIZE (1), UPLOAD_ERR_FORM_SIZE (2), UPLOAD_ERR_PARTIAL (3) u UPLOAD_ERR_NO_FILE (4) sa UPLOAD_ERR_NO_TMP_DIR (6), UPLOAD_ERR_CANT_WRITE (7) u 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);
}

L-eżempju juri biss il-mekkaniżmu. Il-verifika tat-tip tal-fajl, il-ħażna barra mill-webroot u l-imblukkar tal-eżekuzzjoni tal-iskripts jiddeskrivihom il-gwida Kif timplimentaw uploads tal-fajls b'mod sigur f'PHP.

Uploads u PHP2Shell: x'jfissru l-miżuri temporanji

Il-vulnerabbiltajiet PHP2Shell CVE-2026-109618 u CVE-2026-109619 jaffettwaw l-ipproċessar madwar it-talba fl-interpretatur ta' PHP. Għalhekk php.net isemmi bħala miżuri temporanji, fost oħrajn, post_max_size = 8M (mingħajr uploads) jew 32M (b'uploads), upload_max_filesize taħtu, kif ukoll session.upload_progress.enabled=0. Dawn il-valuri jinkitbu f'php.ini, fil-pool ta' FPM jew fil-konfigurazzjoni tas-server, u wara jridu jerġgħu jinbdew il-workers kollha.

Awturi speċjalizzati jissuġġerixxu wkoll li t-talbiet multipart/form-data barra mill-mogħdijiet reali ta' upload jiġu mblukkati fil-proxy jew fil-WAF. Din hija miżura mhux uffiċjali bir-riskju li formoli jinkisru; il-bilanċ tiegħu jiddeskrivih l-artikolu Iffiltrar tat-talbiet ta' upload fit-tarf tan-network. Ebda waħda minn dawn il-miżuri ma tieħu post l-aġġornament għal PHP 8.5.12, 8.4.27, 8.3.36 jew 8.2.35.

Kif jgħin PHP SOS konkretament?

  • Niddeterminaw liema mill-websajts tagħkom verament jeħtieġu uploads u fuq liema mogħdijiet.
  • Nissettjaw il-limiti u l-miżuri temporanji għal kull pool, nerġgħu nibdew il-workers kollha u nittestjaw il-formoli.
  • Niċċekkjaw id-direttorji tal-uploads għal fajls eżegwibbli u nimblukkaw l-eżekuzzjoni tal-iskripts bħala parti mit-tishiħ tas-server.
  • Napplikaw l-aġġornament ta' PHP u niddokumentaw l-istat tal-patches għal kull websajt.

Mistoqsijiet frekwenti

Fejn PHP jaħżen l-ewwel il-fajls li jitgħabbew?

F'direttorju temporanju. B'mod awtomatiku dan huwa d-direttorju temporanju tas-sistema; bi upload_tmp_dir jista' jinbidel. Jekk il-fajl ma jiġix mċaqlaq fl-iskript, PHP ineħħih fi tmiem it-talba.

Nista' nafda l-qasam type f'$_FILES?

Le. It-tip MIME jirrapportah il-browser u, skont il-manwal, PHP ma jivverifikahx. Anki name u full_path jiġu mingħand min jibgħat. It-tip reali tal-fajl tiddeterminawh fuq is-server abbażi tal-kontenut.

Għaliex $_FILES huwa vojt għalkemm intbagħat fajl?

Il-biċċa l-kbira tal-każijiet it-talba kollha kienet akbar minn post_max_size. F'dak il-każ PHP jbattal $_POST u $_FILES kompletament, mingħajr kodiċi ta' żball fl-array. Kawżi oħra huma enctype nieqes fil-formola jew file_uploads mitfija.

Jgħin kontra PHP2Shell jekk nipprojbixxu l-uploads fl-applikazzjoni?

Le. L-ipproċessar tad-data tat-talba jseħħ f'PHP qabel ma jaħdem il-kodiċi tal-applikazzjoni. Jaħdmu l-aġġornament ta' PHP u r-restart tal-workers kollha; limiti aktar stretti huma biss miżura temporanja.

X'inhi d-differenza bejn upload_max_filesize u post_max_size?

upload_max_filesize jillimita kull fajl individwali, post_max_size l-kontenut sħiħ tat-talba, inklużi l-fajls u l-oqsma kollha. Għalhekk post_max_size irid ikun akbar minn upload_max_filesize.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata