# Type Juggling f'PHP: tqabbil laxk bħala riskju ta' sigurtà

> Fehem PHP Type Juggling: kif jaqabbel ==, x'biddel PHP 8.0 u għaliex tokens, hashes u rwoli jridu jiġu mqabbla b'mod strett.

Sors: https://phpsos.de/mt/blog/type-juggling-php/  
Stat: 25/10/2026  
Fornitur: PHP SOS, Għajnuna ta' emerġenza għal PHP u sigurtà tas-server. Għajnuna immedjata fuq WhatsApp: https://wa.me/491736494914?text=Bongu%20PHP%20SOS%2C%20g%C4%A7andna%20b%C5%BConn%20g%C4%A7ajnuna%20bis-server%20tal-PHP%20tag%C4%A7na.%20Kumpanija%3A%20%E2%80%A6%20Websajt%3A%20%E2%80%A6

**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:

1. **`in_array()` u `array_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.
2. **`switch`** jaqabbel b'mod laxk. L-espressjoni `match`, 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.
3. **Inputs JSON** jagħtu tipi veri. Qasam li tistennew bħala string jista' jaslu bħala `true` jew bħala numru u b'`==` jaqbel b'mod sorprendenti.
4. **`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.
5. **Verifika ta' valuri mrritornati**: funzjonijiet bħal `strpos()` jagħtu `0` għal hit fil-bidu u `false` għ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
<?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](https://phpsos.de/mt/blog/sichere-tokens-php/).

> **Importanti:**
> `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:

```bash
# 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](https://phpsos.de/mt/php/typsystem/); kif l-inputs jinġiebu minn qabel fit-tip t-tajjeb turi [Ivvalida u iffiltra l-inputs f'PHP](https://phpsos.de/mt/blog/eingaben-validieren-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](https://phpsos.de/mt/php2shell/php-8-1-und-aelter/).

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 `match` u 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](https://phpsos.de/mt/leistungen/sicherheitsaudit-penetrationstest/).


## 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.

## Sorsi

- [Manwal ta' PHP: operaturi tat-tqabbil](https://www.php.net/manual/de/language.operators.comparison.php)
- [Manwal ta' PHP: match](https://www.php.net/manual/de/control-structures.match.php)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
