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 →

Ivvalida u iffiltra l-inputs f'PHP b'filter_var

Kif l-iżviluppaturi jivverifikaw l-inputs f'PHP b'filter_var, filter_input_array u listi ta' permess, liema filtri huma skaduti u għaliex il-validazzjoni ma tissostitwix prepared statements u l-kodifika tal-output.

Stat 6 min. qariŻvilupp sigur

Fil-qosor: L-inputs f'PHP tivvalidawhom b'filter_var() jew filter_input_array() u regoli ċari għal kull qasam: tip, firxa, tul u valuri permessi. Dak li ma jaqbilx jiġi rifjutat, mhux mibdul bil-kwiet. Il-validazzjoni hija importanti għal data nadifa u inqas wiċċ ta' attakk, imma ma tissostitwix la prepared statements kontra SQL injection u lanqas kodifika xierqa għall-kuntest kontra XSS.

Għaliex „iffiltra kollox“ mhuwiex kunċett

F'ħafna proġetti PHP qodma, fil-bidu ta' kull fajl insibu ċiklu li jibgħat il-valuri kollha minn $_GET u $_POST permezz ta' funzjoni ta' tindif. Dan iħossu sigur. Fil-prattika xi drabi jneħħi wisq, pereżempju apostrofi f'kunjomijiet, u xi drabi ftit wisq, għax l-istess funzjoni suppost tgħodd fl-istess ħin għal SQL, HTML u ismijiet ta' fajls.

Validazzjoni sensata taħdem b'mod differenti: tistaqsi għal kull qasam x'huwa permess hemmhekk. Kwantità ta' ordni hija numru sħiħ bejn 1 u limitu massimu. Qasam ta' ordni huwa wieħed minn tliet valuri fissi. Data hija f'format speċifiku u wara data oħra. Kull ħaġa oħra tiġi rifjutata.

OWASP jiddistingwi hawnhekk żewġ livelli: il-verifika sintattika, jekk valur għandux il-forma t-tajba, u l-verifika semantika, jekk fil-kuntest tagħmilx sens. It-tnejn jappartjenu fuq is-server; verifiki fil-browser iservu biss għall-konvenjenza.

Liema filtri jiġu ma' PHP

L-estensjoni tal-filtri hija inkluża awtomatikament f'PHP. L-aktar filtri importanti ta' validazzjoni skont il-manwal ta' PHP:

Filtru Jivverifika Għażliet importanti u noti
FILTER_VALIDATE_INT numru sħiħ min_range, max_range
FILTER_VALIDATE_FLOAT numru bid-dećimali decimal għas-separatur
FILTER_VALIDATE_BOOL valur ta' verità b'FILTER_NULL_ON_FAILURE jista' jiġi distint minn „falz“
FILTER_VALIDATE_EMAIL forma ta' indirizz tal-posta ma jippruvax li l-kaxxa tal-posta teżisti
FILTER_VALIDATE_URL forma ta' URL ivverifikaw l-iskema intom, l-ebda domains internazzjonalizzati
FILTER_VALIDATE_IP indirizz IP flags għal firxiet privati u riżervati
FILTER_VALIDATE_REGEXP mudell proprju ankraw il-mudell b'^ u $

Il-filtru tat-tindif FILTER_SANITIZE_STRING huwa skadut minn PHP 8.1. Min għadu juża, għandu jibdel il-validazzjoni għal filtri adattati u jużaw htmlspecialchars() għall-output.

filter_var f'PHP: ivverifika formola b'mod nadif

B'filter_input_array() formola kollha tista' tiġi vverifikata f'pass wieħed kontra definizzjoni. Oqsma mhux magħrufa ma jiġux meħuda:

<?php
declare(strict_types=1);

$regeln = [
    'menge'   => ['filter' => FILTER_VALIDATE_INT,
                  'options' => ['min_range' => 1, 'max_range' => 50]],
    'email'   => FILTER_VALIDATE_EMAIL,
    'agb'     => ['filter' => FILTER_VALIDATE_BOOL, 'flags' => FILTER_NULL_ON_FAILURE],
    'versand' => ['filter' => FILTER_VALIDATE_REGEXP,
                  'options' => ['regexp' => '/^(standard|express)$/']],
];

$daten  = filter_input_array(INPUT_POST, $regeln) ?? [];
$fehler = [];

foreach ($regeln as $feld => $_) {
    if (!array_key_exists($feld, $daten) || $daten[$feld] === false || $daten[$feld] === null) {
        $fehler[] = $feld;
    }
}

if ($fehler !== []) {
    http_response_code(422);
    // Uri messaġġ ta' żball għal kull qasam, tipproċessax l-inputs
}

Innotaw it-tqabbil strett b'===: valur validu 0 jew string vojt ma jistax jiġi kkonfuż ma' falliment. Għaliex tqabbil laxk huwa perikoluż hawnhekk jispjegah Type Juggling: tqabbil laxk bħala riskju ta' sigurtà. Kif PHP jagħmel disponibbli d-data tat-talba fl-ewwel lok jiddeskrivi Superglobals: $_GET, $_POST, $_FILES u oħrajn.

Nasbiet b'email, URL u testi ħielsa

Xi filtri jagħmlu inqas milli jissuġġerixxi isimhom:

  1. URLs: FILTER_VALIDATE_URL jaċċetta wkoll skemi oħra minbarra http u https. Ivverifikaw l-iskema wara b'parse_url() kontra lista fissa. Jekk l-URL jinġieb mis-server, japplikaw regoli addizzjonali, ara Evita Server-Side Request Forgery f'PHP.
  2. Indirizzi tal-posta: Il-filtru jivverifika l-forma, mhux is-sjieda. Min irid ikun żgur jibgħat link ta' konferma.
  3. Test ħieles: Ismijiet, messaġġi u indirizzi bilkemm jistgħu jiġu limitati b'mod sensat għal karattri. Ivverifikaw it-tul u l-kodifika tal-karattri, pereżempju b'mb_check_encoding($wert, 'UTF-8'), u fl-output fdaw fuq il-kodifika.
  4. Espressjonijiet regolari: Mingħajr ^ u $ mudell jivverifika biss jekk jidhirx x'imkien fit-test, mhux jekk il-valur kollu jaqbilx.
  5. Arrays minflok strings: Attakkant jista' jibgħat array minflok test. Mingħajr verifika tat-tip dan iwassal għal twissijiet jew imġiba mhux mistennija.
Suġġeriment

Għal valuri fissi ta' għażla bħal ordni, lingwa jew tip ta' konsenja, lista ta' permess b'in_array($wert, $erlaubt, true) jew espressjoni match hija aktar sempliċi u stretta minn kull espressjoni regolari.

Żball frekwenti ieħor jirrigwarda numri b'tifsira, pereżempju prezzijiet, kwantitajiet jew skontijiet. Li valur huwa numru validu ma jgħid xejn dwar jekk huwiex permess fil-kuntest. Kwantità negattiva, skont ogħla mill-valur tal-oġġetti jew prezz meħud mill-formola minflok mid-database huma żbalji klassiċi tal-loġika. Prezzijiet, drittijiet u valuri tal-istatus għalhekk dejjem jappartjenu fuq is-server u qatt f'oqsma moħbija tal-formola.

JSON, webhooks u importazzjonijiet: validazzjoni lil hinn mill-formoli

Ħafna dħul illum mhux formoli aktar, imma talbiet JSON minn apps, webhooks minn servizzi ta' ħlas jew fajls ta' importazzjoni minn fornituri. Anke hemmhekk japplika: l-ewwel aqra b'mod sigur, imbagħad ivverifika. OWASP jagħti parir li l-qies u l-fond tal-inkaljar jiġu llimitati qabel ma d-data titqies fl-ewwel lok. F'PHP json_decode() b'fond massimu u JSON_THROW_ON_ERROR jieħu ħsieb parti minn dan:

<?php
$roh = file_get_contents('php://input', false, null, 0, 65536); // massimu 64 KB
try {
    $daten = json_decode($roh, true, 16, JSON_THROW_ON_ERROR);
} catch (JsonException) {
    http_response_code(400);
    exit;
}
if (!is_array($daten) || !is_string($daten['bestellnummer'] ?? null)) {
    http_response_code(422);
    exit;
}

Mal-webhooks, qabel il-verifika tal-kontenut tqum il-mistoqsija jekk il-messaġġ ġiex tabilħaqq mis-servizz indikat. Jekk is-servizz joffri firma, ivverifikawha u qabblu b'hash_equals(). Mal-fajls ta' importazzjoni ivverifikaw kull linja bħal formola u twaqqfu b'mod nadif f'każ ta' żbalji, minflok ma tieħdu rekords nofs.

Messaġġi ta' żball għandhom isemmu l-qasam ikkonċernat, imma ma jirritornawx il-valur rifjutat mhux iffiltrat. Inkella fil-messaġġ ta' żball innifsu jinħoloq punt ġdid ta' output li jeħtieġ jerġa' jiġi kkodifikat.

Dak li l-validazzjoni ma tistax twettaq

Il-validazzjoni tnaqqas il-wiċċ ta' attakk, imma skont OWASP mhijiex id-difiża ewlenija kontra injection. Kunjom b'apostrofu huwa validu u xorta waħda jrid jiddaħħal b'mod sigur f'database. Dan jirnexxi biss b'prepared statements, kif turi l-gwida Evita SQL Injection f'PHP. U test validu ta' kumment isir bla periklu biss b'kodifika xierqa għall-kuntest fl-output.

L-ordni t-tajba hija għalhekk: ivvalida meta tirċievi, ipparametrizza meta tipproċessa, ikkodifika fl-output. Barra minn hekk quddiemhom jappartjenu limiti tal-qies: talbiet li huma kbar wisq is-server tal-web u PHP m'għandhomx jipproċessawhom kompletament fl-ewwel lok. Għal dan iservu issettjar bħal post_max_size, li wara PHP2Shell għandu jiġi vverifikat xorta waħda.

Kif tgħin PHP SOS b'mod konkret?

  • Nirreġistraw id-dħul kollu tal-applikazzjoni tagħkom: formoli, interfaces, uploads, importazzjonijiet u webhooks.
  • Niddeterminaw għal kull qasam x'huwa permess u nissostitwixxu funzjonijiet ġenerali ta' tindif b'verifiki ċari.
  • Nivverifikaw jekk l-aċċessi għad-database u l-outputs humiex sigurati indipendentement mill-validazzjoni.
  • Niddokumentaw ir-regoli b'mod li t-tim tagħkom ikun jista' jkompli bihom f'funzjonijiet ġodda.

Verifika sistematika tiddeskriviha s-servizz Awditu tas-sigurtà u test ta' penetrazzjoni.

Mistoqsijiet frekwenti

X'inhi d-differenza bejn il-validazzjoni u t-tindif?

Il-validazzjoni tivverifika jekk valur jaqbilx mal-aspettattivi, u inkella tirrifjutah. It-tindif ibiddel il-valur, pereżempju billi jneħħi karattri. Għal deċiżjonijiet ta' sigurtà r-rifjut huwa kważi dejjem aħjar, għax valur mibdul bil-kwiet jista' joħloq żbalji ġodda.

FILTER_SANITIZE_STRING għadu jista' jintuża?

Il-filtru huwa mmarkat bħala skadut minn PHP 8.1. Il-manwal ta' PHP jirrakkomanda minfloku htmlspecialchars() fl-output. Kodiċi eżistenti għandkom tibdluh, għax funzjonijiet skaduti jistgħu jitneħħew f'verżjonijiet futuri.

FILTER_VALIDATE_URL huwa biżżejjed biex il-links isiru sikuri?

Le. Il-filtru jivverifika biss il-forma tal-indirizz. Skont il-manwal, URL validu m'għandux għalfejn jibda b'http, għalhekk intom stess għandkom tivverifikaw l-iskema kontra lista ta' permess bħal https. Ismijiet ta' domains internazzjonalizzati l-filtru jirrifjutahom.

Jeħtieġ nivvalida wkoll data mid-database proprja?

Fl-output titqies bħala mhux affidabbli u tiġi kkodifikata kif suppost. Validazzjoni ġdida hija sensata meta d-data oriġinarjament ġiet minn barra u issa tintuża f'kuntest ġdid, pereżempju bħala isem ta' fajl jew parti minn kmand.

Il-validazzjoni tgħin kontra PHP2Shell?

Le. PHP2Shell jirrigwarda l-ipproċessar tat-talbiet fl-interpretatur ta' PHP, qabel ma jaħdem xi kodiċi tal-applikazzjoni tagħkom. Kontra dan jgħin biss l-aġġornament ta' PHP segwit mir-restart tal-proċessi kollha ta' PHP.

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