Fil-qosor: PHP Type Juggling hija l-konverżjoni awtomatika tat-tip li fit-tqabbil laxk b'== tiddeċiedi r-riżultat. Minn PHP 8.0 ir-regoli huma aktar stretti, imma strings numeriċi jibqgħu jitqabblu bħala numri, u true, false u null isegwu regoli proprji. Għal verifiki rilevanti għas-sigurtà għalhekk japplika: ===, in_array(..., true), match minflok switch, hash_equals() għal tokens u password_verify() għal passwords.
Tqabbil li huwa veru anke jekk m'għandux ikun
Ħafna vulnerabbiltajiet f'applikazzjonijiet PHP mhumiex f'funzjonijiet ikkumplikati, imma f'karattru wieħed: == fejn kellu jkun ===. Il-kodiċi jidher korrett, it-testijiet b'inputs normali jgħaddu, u madankollu, taħt ċerti kundizzjonijiet, il-verifika tħalli tgħaddi xi ħaġa li kellha twaqqaf.
Il-kawża hija karatteristika ta' PHP li fl-użu ta' kuljum hija prattika: il-valuri jiġu kkonvertiti f'tip ieħor meta jkun hemm bżonn. String minn formola tista' b'hekk titqabbel mingħajr triq twila ma' numru mid-database. Fil-logins, tokens, rwoli jew oqsma tal-istatus, eżattament din il-ġenerożità tista' ssir perikoluża.
Kif PHP jaqabbel b'==
Il-manwal ta' PHP jiddeskrivi fid-dettall ir-regoli għat-tqabbil laxk. Għas-sigurtà huma importanti l-aktar dawn il-każijiet:
| Tqabbil | PHP 7 | PHP 8 | Raġuni |
|---|---|---|---|
0 == "a" |
veru | falz | minn PHP 8.0 imqabbel bħala strings |
"1" == "01" |
veru | veru | it-tnejn numeriċi, tqabbil bħala numru |
"10" == "1e1" |
veru | veru | in-notazzjoni esponenzjali hija numerika |
100 == "1e2" |
veru | veru | numru kontra string numeriku |
null == false |
veru | veru | tqabbil bħala valur ta' verità |
"abc" == true |
veru | veru | string mhux vojt jitqies veru |
Il-bidla f'PHP 8.0 naqqset klassi sħiħa ta' żbalji: qabel, string mhux numeriku fit-tqabbil ma' numru sar 0. Dan kien jolqot ukoll struzzjonijiet switch. Il-linji l-oħra tat-tabella, madankollu, juru li tqabbil laxk xorta jaħbi sorpriżi.
Anke l-operaturi <, > u l-operatur tat-tqabbil <=> isegwu dawn ir-regoli. Fl-issortjar dan ġeneralment huwa bla ħsara, imma f'verifiki bħal „ammont iżgħar mil-limitu“ b'valuri mit-talba t-tip għandu jkun magħruf minn qabel.
Partikolarment qarrieqa hija l-linja bin-notazzjoni esponenzjali. Valuri ta' hash u tokens spiss jikkonsistu minn ċifri u ittri. Jekk valur bħal dan b'kumbinazzjoni jidher bħal numru f'notazzjoni esponenzjali, == jista' jqabbel żewġ hashes differenti bħala indaqs. Dan huwa l-isfond ta' ħafna rapporti dwar evitar tal-login f'applikazzjonijiet PHP aktar qodma.
PHP Type Juggling f'verifiki tipiċi ta' sigurtà
Tqabbil laxk jinħeba f'aktar postijiet mill-operatur == biss:
in_array()uarray_search()jaqabblu mingħajr it-tielet parametru b'mod laxk. Lista ta' permess b'rwoli jew IDs b'hekk issir iktar artab milli taħsbu.switchjaqabbel b'mod laxk. L-espressjonimatch, disponibbli minn PHP 8.0, skont il-manwal tqabbel minflok b'mod sigur għat-tip b'===u tjib żball jekk l-ebda fergħa ma taqbel.- Inputs JSON jagħtu tipi veri. Qasam li tistennew bħala string jista' jaslu bħala
truejew bħala numru u b'==jaqbel b'mod sorprendenti. strcmp()għal sigrieti mhuwiex adattat, għax il-ħin tat-tħaddim jiddependi mill-kontenut u każijiet ta' żball faċilment jiġu evalwati ħażin.- Verifika ta' valuri mrritornati: funzjonijiet bħal
strpos()jagħtu0għal hit fil-bidu ufalsegħal l-ebda hit.if (!strpos(...))jikkonfondi t-tnejn.
Tqabbil sigur: il-paragun
L-eżempji li ġejjin juru kull darba l-verżjoni mhux sigura u s-sigura:
<?php
declare(strict_types=1);
// Ivverifika r-rwol
$erlaubteRollen = ['admin', 'redaktion'];
in_array($rolle, $erlaubteRollen); // mhux sigur: laxk
in_array($rolle, $erlaubteRollen, true); // sigur: strett
// Evalwa l-istatus
$aktion = match ($status) { // strett, żball b'valur mhux magħruf
'offen' => 'bearbeiten',
'erledigt' => 'archivieren',
};
// Ivverifika token minn link
if ($tokenAusLink == $gespeichertesToken) { /* mhux sigur */ }
if (is_string($tokenAusLink) && hash_equals($gespeichertesToken, $tokenAusLink)) { /* sigur */ }
// Ivverifika password
if (md5($eingabe) == $hash) { /* mhux sigur: proċedura dgħajfa u tqabbil laxk */ }
if (password_verify($eingabe, $hash)) { /* sigur */ }
// Fittex substring
if (strpos($text, 'abc') !== false) { /* korrett: anke hit fil-pożizzjoni 0 */ }
hash_equals() skont il-manwal jistenna s-sigriet magħruf bħala l-ewwel parametru u l-valur tal-utent bħala t-tieni u jaqabbel f'ħin kostanti. Kif toħolqu tokens b'mod sigur fl-ewwel lok jiddeskrivi Numri każwali u tokens sikuri f'PHP.
declare(strict_types=1) ma jagħmilx it-tqabbil strett. L-istruzzjoni tirrigwarda biss il-konverżjoni tat-tip f'sejħiet ta' funzjonijiet u valuri mrritornati. Tqabbil laxk irid jinbidel intom stess fil-kodiċi.
Tqabbil strett għandu naħa oħra: jfalli meta t-tipi ma jaqblux. '42' === 42 huwa falz. Valuri minn formoli u URLs jaslu f'PHP bħala strings, valuri mid-database skont id-driver u l-issettjar bħala strings jew numri. Min iddaħħal === kullimkien mingħajr ma jaqbel it-tipi, joħloq żbalji li fl-operat jidhru bħala rifjut ta' utenti leġittimi.
Is-soluzzjoni hija fruntiera ċara: l-inputs jiġu vvalidati meta jaslu u jinġiebu fit-tip t-tajjeb, pereżempju b'filter_var($wert, FILTER_VALIDATE_INT), u wara fil-kodiċi jiġu trattati biss b'dikjarazzjonijiet tat-tip u tqabbil strett. Dikjarazzjonijiet tat-tip fuq parametri, ritorni u proprjetajiet jgħinu f'dan, għax tipi ħżiena jidhru kmieni b'messaġġ ta' żball, minflok ma jisparixxu bil-kwiet f'tqabbil.
Ivverifika kodiċi eżistenti b'mod sistematiku
Fi proġetti li kibru insibu tqabbil laxk bi mijiet. Mhux kull wieħed huwa problema. Ikkonċentraw fuq postijiet fejn tittieħed deċiżjoni dwar l-aċċess:
# Tqabbil laxk f'linji b'termini rilevanti għas-sigurtà
grep -rnE "[^=!]==[^=]" src/ --include="*.php" | grep -iE "token|hash|pass|role|rolle|admin|auth|sign"
# in_array mingħajr tqabbil strett
grep -rnE "in_array\([^)]*\)" src/ --include="*.php" | grep -v ", true)"
Għodod ta' analiżi statika bħal PHPStan jew Psalm jistgħu, jekk irid, jirrapportaw tqabbil laxk b'mod permanenti. B'hekk każijiet ġodda ma jaslux fil-fergħa ewlenija fl-ewwel lok. Bażi dwar it-tipi tiddeskriviha It-tip sistema ta' PHP; kif l-inputs jinġiebu minn qabel fit-tip t-tajjeb turi Ivvalida u iffiltra l-inputs f'PHP.
Dak li dan ifisser għal sistemi antiki
Applikazzjonijiet li għadhom jaħdmu fuq PHP 7 huma affettwati mir-regoli antiki u aktar laxki tat-tqabbil. Ta' dan jiżdied it-tieni problema: għal PHP 8.1 u aktar qodma l-proġett PHP ma joffrix aktar aġġornamenti uffiċjali tas-sigurtà, anke mhux kontra PHP2Shell. Is-sitwazzjoni tiddeskriviha PHP 8.1 u aktar qodma: x'japplika issa.
Fi migrazzjoni għal PHP 8 xi riżultati tat-tqabbil jinbidlu. Dan ġeneralment huwa titjib, imma jista' jkisser kodiċi li kien jiddependi mill-imġiba l-qadima. Ippjanaw għalhekk testijiet li jkopru b'mod mirat tqabbil ma' numri, valuri vojta u null.
Kif tgħin PHP SOS b'mod konkret?
- Infittxu fil-kodiċi tagħkom tqabbil laxk f'postijiet li jiddeċiedu dwar il-login, id-drittijiet jew il-ħlasijiet.
- Nissostitwixxuhom b'tqabbil strett, espressjonijiet
matchu funzjonijiet ta' verifika adattati. - Nistabbilixxu analiżi statika b'mod li tqabbil laxk ġdid jidher fil-build.
- Nakkumpanjaw migrazzjonijiet għal verżjonijiet attwali ta' PHP b'testijiet għal regoli mibdula tat-tqabbil.
Verifika tas-softwer tagħkom tiddeskriviha Awditu tas-sigurtà u test ta' penetrazzjoni.
Mistoqsijiet frekwenti
X'inhu Type Juggling f'PHP?
PHP f'xi operazzjonijiet jikkonverti awtomatikament valuri ta' tipi differenti, pereżempju string f'numru. Fit-tqabbil laxk b'== din il-konverżjoni tiddeċiedi r-riżultat. Dan huwa komdu, imma jista' jwassal għal tqabbil li jkun veru anke jekk il-valuri ma jidhrux indaqs.
PHP 8 solva l-problema?
Parzjalment. Minn PHP 8.0 numru mqabbel ma' string mhux numeriku jitqabbel bħala string, għalhekk 0 == 'a' ma jibqax veru. Żewġ strings numeriċi, madankollu, jibqgħu jitqabblu bħala numri, u t-tqabbil ma' true, false u null isegwi regoli proprji.
declare(strict_types=1) jgħin kontra tqabbil laxk?
Le. strict_types jikkontrolla jekk tipi skalari jiġux ikkonvertiti awtomatikament f'sejħiet ta' funzjonijiet u ritorni. Ma għandu l-ebda influwenza fuq l-operaturi tat-tqabbil == u !=.
Kif inqabbel passwords u tokens sewwa?
Passwords tivverifikawhom b'password_verify, tokens u firem b'hash_equals. It-tnejn jaqabblu eżatt u, hash_equals, f'ħin kostanti. Tqabbil b'== jew strcmp mhuwiex adattat għal dan.