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 timplimentaw uploads sikuri tal-fajls f'PHP: sigurtà tal-uploads f'PHP

Il-formoli tal-upload huma triq frekwenti għal webshells. Kif tivverifikaw it-tipi tal-fajls sewwa, taħżnu l-fajls b'mod sikur u tipprevjenu li s-server jesegwixxi skripts imgħobbija.

Stat 6 min. qariGwidi

Fil-qosor: Fis-sigurtà tal-uploads f'PHP ma tiddeċiedix verifika waħda, imma l-kombinazzjoni: tivverifikaw it-tip tal-fajl fuq is-server, issemmu mill-ġdid il-fajls, taħżnuhom barra mill-webroot u ma tippermettux eżekuzzjoni ta' skripts fil-folder tal-upload. Formola tal-upload mhux ivverifikata hija waħda mit-toroq klassiċi li bihom l-attakkanti jdaħħlu backdoor fuq server tal-web.

Għaliex il-formoli tal-upload huma punt favorit ta' dħul

Kull formola li taċċetta fajls tikteb data barranija fuq is-server tagħkom. Dan jinkludi formoli ta' applikazzjoni, portals tal-klijenti, gallariji tal-immaġini, żoni ta' appoġġ u ħafna estensjonijiet ta' CMS u ħwienet. Jekk attakkant jirnexxilu jpoġġi hemm fajl li s-server tal-web imbagħad jesegwixxi bħala PHP, ikollu backdoor permanenti.

Għall-maniġment dan ifisser: upload li jidher bla ħsara għal CVs jista' fl-agħar każ iwassal biex jittieħed is-server tal-web kollu. Barra minn hekk, fil-folders tal-upload spiss ikun hemm data personali li, b'konfigurazzjoni żbaljata, tista' tinqara pubblikament.

Għall-admins u l-iżviluppaturi dan ifisser: il-kodiċi tal-applikazzjoni u l-konfigurazzjoni tas-server iridu jaqblu. Dgħufija f'livell waħda spiss tinqabad mill-oħra, jekk it-tnejn jiġu implimentati sewwa. Kif issibu fajls diġà introdotti tiddeskrivi l-gwida Kif tagħrfu u tneħħu webshells.

Ir-regoli bażiċi għas-sigurtà tal-uploads f'PHP

Ir-regoli li ġejjin jikkorrispondu għar-rakkomandazzjonijiet tal-OWASP Cheat Sheets u ppruvaw ruħhom fit-tħaddim:

  • Lista permessa minflok lista bloċċata: Aċċettaw biss tipi ta' fajls espliċitament permessi, pereżempju PDF, JPG u PNG. Listi bloċċati għal estensjonijiet individwali jistgħu jiġu evitati permezz ta' varjanti u estensjonijiet doppji.
  • Ivverifikaw il-kontenut, mhux biss l-estensjoni: Iddeterminaw it-tip attwali fuq is-server b'finfo. It-tip MIME f'$_FILES huwa dikjarazzjoni tal-mittent u mhux affidabbli.
  • Isem ġdid tal-fajl: Qatt ma tużaw l-isem oriġinali bħala isem tal-fajl. Oħolqu isem każwali u żidu l-estensjoni mil-lista permessa.
  • Ħażna barra mill-webroot: Aħżnu l-fajls b'mod li ma jintlaħqux direttament permezz ta' URL. Il-konsenja ssir permezz ta' skript b'verifika tal-awtorizzazzjoni.
  • Illimitaw id-daqs: Fl-applikazzjoni, f'PHP u fis-server tal-web.
  • L-ebda eżekuzzjoni: Jekk l-uploads xorta jridu jkunu fil-webroot, itfu l-eżekuzzjoni ta' skripts f'dan id-direttorju.
  • Verifika biss fuq is-server: Verifiki ta' JavaScript fil-browser itejbu l-użu, imma ma jipproteġux.

Eżempju sikur b'finfo u isem każwali

L-eżempju li ġej juri l-qalba ta' pproċessar sikur. Huwa apposta qasir u jrid jiddaħħal fl-applikazzjoni tagħkom, jiġifieri b'login, verifika tal-awtorizzazzjoni, protezzjoni CSRF u reġistrazzjoni.

<?php
declare(strict_types=1);

const MAX_BYTES  = 5 * 1024 * 1024; // 5 MB
const ERLAUBT    = [
    'application/pdf' => 'pdf',
    'image/jpeg'      => 'jpg',
    'image/png'       => 'png',
];
const ZIELORDNER = '/var/www/daten/uploads'; // barra mill-webroot

$datei = $_FILES['dokument'] ?? null;

if (!is_array($datei) || $datei['error'] !== UPLOAD_ERR_OK) {
    http_response_code(400);
    exit('Upload fehlgeschlagen.');
}

if ($datei['size'] > MAX_BYTES || !is_uploaded_file($datei['tmp_name'])) {
    http_response_code(400);
    exit('Datei ungültig.');
}

$finfo = new finfo(FILEINFO_MIME_TYPE);
$typ   = $finfo->file($datei['tmp_name']);

if (!isset(ERLAUBT[$typ])) {
    http_response_code(415);
    exit('Dateityp nicht erlaubt.');
}

$name = bin2hex(random_bytes(16)) . '.' . ERLAUBT[$typ];
$ziel = ZIELORDNER . '/' . $name;

if (!move_uploaded_file($datei['tmp_name'], $ziel)) {
    http_response_code(500);
    exit('Speichern fehlgeschlagen.');
}

chmod($ziel, 0640);
// Aħżnu l-isem oriġinali biss bħala test fid-database
// u f'kull output eskeppjawh b'htmlspecialchars().

Għall-immaġini jixraq pass ieħor: ikkodifikaw mill-ġdid l-immaġni b'GD jew Imagick u armu l-metadata. Dan ma jissostitwixxix il-verifiki l-oħra, imma jnaqqas ir-riskju li jifdal minħabba data barranija inkorporata.

Għal dokumenti minn sorsi mhux magħrufa, pereżempju applikazzjonijiet jew ritratti ta' ilmenti, huwa sensat ukoll scan tal-viruses qabel ma jingħaddew 'il quddiem. Jipproteġi anqas is-server tal-web milli l-impjegati li aktar tard jiftħu l-fajls fuq il-kompjuters tax-xogħol tagħhom. Irreġistraw ukoll kull upload bil-ħin, il-kont, id-daqs tal-fajl u t-tip identifikat, biex mudelli mhux tas-soltu jkunu jistgħu jiġu traċċati aktar tard.

F'CMS u ħwienet il-libreriji tal-midja inkorporati ġeneralment iġibu verifiki proprji. Aktar riskjużi huma l-estensjonijiet tal-formoli, il-funzjonijiet ta' importazzjoni u paġni addizzjonali mibnija apposta, li jaħżnu fajls billi jevitaw il-librerija. Propju dawn il-postijiet għandkom tħarsu lejhom l-ewwel waqt verifika.

Suġġeriment

Ikkunsinjaw fajls mill-folder protett b'Content-Disposition: attachment u X-Content-Type-Options: nosniff. Imbagħad il-browser ma juri direttament l-ebda kontenut problematiku, imma joffrih bħala download.

Itfu l-eżekuzzjoni ta' PHP fil-folder tal-upload

Anke jekk fajl b'kontenut żbaljat jgħaddi, is-server tal-web m'għandux jesegwih bħala skript. Din it-tieni saff ta' protezzjoni tappartjeni fuq kull server li jaħżen uploads fil-webroot.

Għal Nginx b'PHP-FPM:

location ^~ /uploads/ {
    location ~* \.(php|phtml|phar)$ {
        deny all;
    }
}

Għal Apache, l-aħjar direttament fil-VirtualHost minflok f'.htaccess, biex ir-regola ma tkunx tista' tiġi megħluba mill-applikazzjoni:

<Directory "/var/www/html/uploads">
    AllowOverride None
    <FilesMatch "\.(php|phtml|phar)$">
        Require all denied
    </FilesMatch>
</Directory>

Jekk PHP jaħdem bħala modulu ta' Apache (mod_php), fl-istess blokk tistgħu iżżidu wkoll php_admin_flag engine off. Wara l-bidla ivverifikaw b'fajl tat-test bla ħsara, li jtella' test biss, li s-server iweġibha b'403.

Limiti tad-daqs u r-rabta ma' PHP2Shell

L-uploads huma marbutin mill-qrib mal-issettjar ta' PHP post_max_size u upload_max_filesize. Fil-kuntest ta' PHP2Shell php.net jirrakkomanda bħala miżura temporanja li post_max_size jiġi ffissat fuq 8M meta ma jinħtieġu l-ebda uploads, jew fuq 32M b'uploads, u upload_max_filesize jinżamm taħtu. Din mhix protezzjoni sħiħa u ma tissostitwixxix l-aġġornament għal verżjoni rranġata ta' PHP.

; php.ini jew pool FPM (php_admin_value), wara dan erġgħu ibdew il-workers kollha
file_uploads        = On
post_max_size       = 32M
upload_max_filesize = 20M
max_file_uploads    = 5

Jekk websajt ma teħtieġ l-ebda uploads, file_uploads = Off hija l-aktar soluzzjoni nadifa. Liema issettjar huma sensati sal-patch jinsab taħt Miżuri immedjati mingħajr patch. Drittijiet xierqa għal direttorji tal-upload tiddeskrivi l-gwida Drittijiet tal-fajls fuq is-server tal-web.

Żbalji tipiċi fil-funzjonijiet tal-upload

Meta jiġu eżaminati applikazzjonijiet eżistenti, l-istess mudelli jidhru ripetutament. Ivverifikaw il-formoli tagħkom b'mod immirat għal dawn il-punti:

  • L-estensjoni tiġi vverifikata biss parzjalment, hekk li ismijiet tal-fajls b'diversi estensjonijiet jgħaddu.
  • L-isem oriġinali mill-formola jispiċċa fil-mogħdija tal-ħażna. Dan jiftaħ toroq għall-manipulazzjoni tal-mogħdijiet u għas-sovrascrittura ta' fajls eżistenti.
  • L-uploads jinsabu pubblikament b'ismijiet prevedibbli. Fil-każ ta' applikazzjonijiet jew kuntratti dan huwa wkoll problema ta' protezzjoni tad-data.
  • Il-folder tal-upload jista' jinkiteb mis-server tal-web u fl-istess ħin jista' jiġi eżegwit.
  • Estensjonijiet qodma tal-upload jew plugins tal-formoli ma jiġux aġġornati, għalkemm il-manifattur ippubblika aġġornamenti tas-sigurtà.
  • L-iżbalji ma jiġux irreġistrati. Uploads miċħuda, madankollu, huma sinjal bikri ta' tentattivi immirati.

Kif tgħin PHP SOS b'mod konkret?

  • Nivverifikaw il-funzjonijiet tal-upload tagħkom fil-kodiċi u fil-konfigurazzjoni tas-server u nsemmu dgħufijiet konkreti bi prijorità.
  • Napplikaw is-sakra tal-eżekuzzjoni fil-folder tal-upload, drittijiet xierqa u limiti tad-daqs fil-qafas tat-Tisħiħ tas-server.
  • B'suspett infittxu fid-direttorji tal-upload skripts introdotti u ninnadfuhom permezz tat-Tneħħija ta' malware tagħna.
  • Fuq talba nħallu l-implimentazzjoni tiġi vverifikata b'mod indipendenti permezz ta' test ta' penetrazzjoni.

Mistoqsijiet frekwenti

Huwa biżżejjed li tiġi vverifikata l-estensjoni tal-fajl fl-upload?

Le. L-estensjoni u t-tip MIME irrapportat mill-browser ġejjin mill-mittent u jistgħu jintgħażlu liberament. Ivverifikaw il-kontenut fuq is-server, agħtu isem ġdid lill-fajl u imblukkaw l-eżekuzzjoni tal-iskripts fid-direttorju tal-uploads.

Fejn għandhom jinħażnu l-fajls mgħobbija?

L-aħjar barra mid-direttorju pubbliku tal-web. Il-konsenja imbagħad tieħu hi skript li qabel jivverifika jekk l-utent jistax jara l-fajl. Hekk il-fajls la jistgħu jinfetħu direttament u lanqas jiġu eżegwiti.

Fajls SVG bħala immaġini huma bla periklu?

Mhux awtomatikament. SVG huwa XML u jista' jkun fih kontenut attiv. Ippermettu SVG biss jekk tnaddfu l-fajls jew tikkunsinjawhom esklussivament bħala download bl-header Content-Disposition xieraq.

Id-daqs tal-upload għandu x'jaqsam ma' PHP2Shell?

Iva, indirettament. php.net jirrakkomanda bħala miżura temporanja valuri aktar baxxi għal post_max_size u upload_max_filesize. Dan inaqqas ir-riskju, imma ma jissostitwixxix l-aġġornament għal verżjoni rranġata ta' PHP u r-restart tal-workers kollha.

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