Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

PHP tipu sistēma

PHP ir dinamiski tipizēta, taču kopš PHP 7 tai ir pieaugoši stingra tipu sistēma. Šeit redzami tipi, svarīgākās versijas un kāpēc stingra salīdzināšana novērš drošības kļūdas.

Aktuāls uz 4 min lasīšanas laiksPHP zināšanas

Īsi: PHP ir dinamiski tipizēta: vērtības tips kļūst zināms tikai izpildes laikā, un bez papildu norādēm PHP vērtības pēc vajadzības pārveido automātiski. Taču kopš PHP 7 parametriem, atgriežamajām vērtībām un īpašībām var norādīt tipus, un declare(strict_types=1) padara pārbaudi stingru. Kas pārzina noteikumus un izmanto stingru salīdzināšanu ar ===, izvairās no vesela loģikas un drošības kļūdu veida.

Dinamiski tipizēta, bet ne bez tipiem

PHP gadījumā $preis = 19.90; tips nav jānorāda. PHP atpazīst, ka tas ir decimālskaitlis. Ja vērtību vēlāk savieno ar rindiņu, PHP to pārveido. Šo uzvedību sauc par Type Juggling, tas ir, automātisku tipu pārveidi. Tas atvieglo ienākšanu valodā, bet var radīt negaidītus rezultātus.

Lēmumu pieņēmējiem tas ir būtiski, jo daudzas vecākas PHP lietojumprogrammas rakstītas bez tipu norādēm. Šādu kodu ir grūtāk pārbaudīt un modernizēt. Jaunāki projekti tipus izmanto konsekventi, tāpēc kļūdas kļūst redzamas agrāk un statiskā analīze ar rīkiem, piemēram, PHPStan vai Psalm, kļūst patiešām efektīva.

PHP tipu pārskats

PHP rokasgrāmata min deviņus iekšējos tipus, kādi var būt katram izteiksmes rezultātam. Parasti tos iedala trīs grupās:

Grupa Tipi Piemērs
Skalārie tipi bool, int, float, string true, 42, 3.5, "Text"
Salikti tipi array, object, callable [1, 2], new DateTime()
Īpašie tipi null, resource null, atvērts fails

Tipu pārbaudēm rokasgrāmata iesaka is_*() funkcijas, piemēram, is_int(). Izpētei der get_debug_type(), kas kopš PHP 8.0.0 atgriež ierastos tipu nosaukumus, savukārt vecākā gettype() atgriež, piemēram, "integer" un "double".

Līdzās automātiskajai pārveidei ir arī tiešā: ar cast, piemēram, (int) $wert, vai ar settype() kods pats nosaka, kādam tipam jābūt vērtībai. Tas ir ierasts ievadei no veidlapām, jo viss, kas nāk caur $_GET vai $_POST, vispirms ir rindiņa vai masīvs. Taču cast nepārbauda, vai vērtība bija jēgpilna: no "abc" bez paziņojuma kļūst 0. Ievadei tāpēc parasti labāka izvēle ir īsta pārbaude ar filter_var().

Klases un interfeisi PHP arī ir tipi. Funkcija tātad var pieprasīt, ka parametrs ir noteiktas klases objekts vai ievieš noteiktu interfeisu. Kā klases, interfeisi un enum sadarbojas, izskaidro lapa Objektorientētā programmēšana PHP.

Tipu deklarācijas: no PHP 7.1 līdz 8.3

Tipu deklarācijas nosaka, kādas vērtības funkcija pieņem un atgriež. Tipu sistēma ir augusi cauri daudzām versijām. Saskaņā ar rokasgrāmatas izmaiņu žurnālu pievienotas, cita starpā, šādas iespējas:

Versija Jaunums
7.1.0 nullable tipi (?int), void, iterable
7.2.0 object
7.4.0 tipizētas klases īpašības
8.0.0 Union tipi (vairāki atļauti tipi vienā norādē), mixed, atgriežamais tips static
8.1.0 Intersection tipi (A&B), atgriežamais tips never
8.2.0 DNF tipi, literālais tips true, null un false kā patstāvīgi tipi
8.3.0 tipizētas klašu, interfeisu, trait un enum konstantes

DNF apzīmē disjunktīvo normālformu un ļauj kombinācijas, piemēram, (A&B)|null. Kas plāno PHP versijas, no šīs tabulas redz arī to, kādas valodas iespējas lietojumprogramma prasa.

strict_types: pārveide vai TypeError

Bez papildu norādes PHP darbojas pārveides režīmā. Funkcija ar int parametriem tad pieņem arī 1.5 un izveido 1; kopš PHP 8.1 šī zaudējumus radošā pārveide ir atzīta par novecojušu. Ar declare(strict_types=1) faila sākumā PHP tā vietā izmet TypeError.

<?php
declare(strict_types=1);

function summe(int $a, int $b): int
{
    return $a + $b;
}

echo summe(1, 2);      // 3
echo summe(1.5, 2.5);  // TypeError, nevis bez paziņojuma 3

Svarīgas divas nianses. Pirmkārt, strict_types attiecas uz izsaukumiem no faila, kurā tas norādīts, nevis uz tur definētajām funkcijām. Ja fails bez strict_types izsauc to pašu funkciju, notiek pārveide. Otrkārt, vesels skaitlis tur, kur gaidāms decimālskaitlis, ir atļauts arī stingrajā režīmā.

Brīvā un stingrā salīdzināšana

Operators == salīdzina pēc tipu pārveides, === salīdzina vērtību un tipu bez pārveides. Rokasgrāmata vairumā gadījumu iesaka === un !==, jo pārveides noteikumi ne vienmēr ir acīmredzami.

<?php
var_dump(0 == "a");    // PHP 7: true,  PHP 8: false
var_dump("1" == "01"); // true, abas ir numeriskas rindiņas
var_dump("1" === "01");// false, tas pats tips, bet cita rindiņa
var_dump(1 == true);   // true
var_dump(1 === true);  // false

Ar PHP 8.0 salīdzināšana starp skaitļiem un nenumeriskām rindiņām kļuva saprātīgāka. Vecākas lietojumprogrammas pēc jauninājuma var uzvesties citādi, piemēram, switch blokos. Arī ar PHP 8.0 ieviestā match izteiksme vienmēr salīdzina stingri. Kā brīvā salīdzināšana noved pie drošības ievainojamībām, piemēram, tokenu vai paroļu pārbaudēs, apraksta raksts Type Juggling: brīvā salīdzināšana kā drošības risks.

Tipi, jauninājumi un PHP2Shell

Stingra tipu sistēma padara lietojumprogrammas kodu noturīgāku, taču neaizsargā pret kļūdām pašā interpretatorā. PHP2Shell ievainojamības CVE-2026-109618 un CVE-2026-109619 atrodas PHP atmiņas un pieprasījumu pārvaldībā. Tās novērstas PHP 8.5.12, 8.4.27, 8.3.36 un 8.2.35; pēc tam jāpārstartē visi PHP procesi.

Tipu sistēmai tomēr ir nozīme, proti, jauninājuma laikā. Lietojumprogrammas, kas joprojām darbojas ar PHP 8.1 vai vecāku, no PHP projekta vairs nesaņem oficiālus atjauninājumus. Labi tipizētu kodu ir ievērojami vieglāk pacelt uz atbalstītu versiju, jo rīki nesaderības atrod agri. Vecākiem projektiem palīdz mūsu migrācija uz atbalstītu PHP versiju.

Padoms

Ieslēdziet strict_types pakāpeniski jaunos un pārstrādātos failos. Tā tipu drošība aug, un vecais kods nesabrūk uzreiz.

Kā PHP SOS palīdz konkrēti?

  • Mēs pārbaudām, kāda PHP versija jūsu lietojumprogrammai vismaz nepieciešama, un salīdzinām to ar novērstajām versijām.
  • Mēs palaižam statisko analīzi pār kodu un atzīmējam vietas ar brīvu salīdzināšanu drošībai svarīgās pārbaudēs.
  • Mēs plānojam jauninājumus tā, lai mainītie salīdzināšanas noteikumi tiktu iepriekš pārbaudīti.
  • Mēs ieviešam PHP atjauninājumu, pārstartējam visus darbprocesus un dokumentējam stāvokli.

Biežāk uzdotie jautājumi

Vai PHP ir stingri vai vāji tipizēta?

PHP ir dinamiski tipizēta: mainīgā tips kļūst zināms tikai izpildes laikā. Bez strict_types PHP vērtības pēc vajadzības pārveido. Ar tipu deklarācijām un strict_types kodu var padarīt ļoti stingru.

Ko dara declare(strict_types=1)?

Tas izslēdz skalāro vērtību automātisko pārveidi izsaukumiem no attiecīgā faila. Ja vērtība neatbilst deklarētajam tipam, PHP izmet TypeError. Vienīgais izņēmums ir vesels skaitlis tur, kur gaidāms decimālskaitlis.

Kāpēc 0 == "a" PHP 8 ir nepatiess, bet PHP 7 patiess?

Līdz PHP 7 nenumeriska rindiņa salīdzināšanā ar skaitli tika pārveidota skaitlī, un no "a" kļuva 0. Kopš PHP 8.0 PHP šādā gadījumā vairs nesalīdzina skaitliski, un rezultāts ir false.

Vai tipi pasargā no drošības ievainojamībām pašā PHP?

Nē. Tipi novērš kļūdas jūsu lietojumprogrammas kodā. Interpretatora ievainojamības, piemēram, PHP2Shell, aizver tikai PHP atjauninājums. Taču modernas tipu funkcijas prasa aktuālas PHP versijas, tāpēc tās ir labs iemesls jauninājumam.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība