Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

Sustav tipova u PHP-u

PHP je dinamički tipiziran, ali je od PHP-a 7 dobio sve stroži sustav tipova. Ovdje vidite tipove, najvažnije verzije i zašto stroge usporedbe sprječavaju sigurnosne pogreške.

Stanje 5 min čitanjaPHP znanje

Ukratko: PHP je dinamički tipiziran: tip vrijednosti utvrđuje se tek tijekom izvođenja, a bez daljnjih zadanih pravila PHP po potrebi automatski pretvara vrijednosti. Od PHP-a 7 parametre, povratne vrijednosti i svojstva ipak je moguće opremiti tipovima, a declare(strict_types=1) provjeru čini strogom. Tko poznaje pravila i koristi stroge usporedbe s ===, izbjegava cijelu klasu logičkih i sigurnosnih pogrešaka.

Dinamički tipiziran, ali ne bez tipova

U PHP-u kod $preis = 19.90; nije potrebno navesti tip. PHP prepoznaje da je riječ o decimalnom broju. Ako se vrijednost kasnije poveže s nizom znakova, PHP je pretvara. To se ponašanje naziva type juggling, odnosno automatsko pretvaranje tipova. Olakšava početak, ali može dovesti do iznenađujućih rezultata.

Za donositelje odluka to je važno jer su mnoge starije PHP aplikacije pisane bez oznaka tipova. Takav je kod teže provjeravati i modernizirati. Novije projekte dosljedno koriste tipove, što pogreške čini ranije vidljivima i tek tada omogućuje punu učinkovitost statičke analize alatima poput PHPStana ili Psalma.

Pregled PHP-ovih tipova

PHP priručnik navodi devet internih tipova koje može imati svaki izraz. Uobičajeno se dijele u tri skupine:

Skupina Tipovi Primjer
Skalarni tipovi bool, int, float, string true, 42, 3.5, "Text"
Složeni tipovi array, object, callable [1, 2], new DateTime()
Posebni tipovi null, resource null, otvorena datoteka

Za provjere tipova priručnik preporučuje funkcije is_*() poput is_int(). Za ispitivanje je prikladna funkcija get_debug_type(), koja od PHP-a 8.0.0 vraća uobičajene nazive tipova, dok starija gettype() vraća, primjerice, "integer" i "double".

Uz automatsko pretvaranje postoji i izričito: castom poput (int) $wert ili funkcijom settype() sâm kod određuje koji tip vrijednost treba imati. To je uobičajeno kod unosa iz obrazaca jer je sve što stiže putem $_GET ili $_POST isprva niz znakova ili polje. Cast, međutim, ne provjerava je li vrijednost bila smislena: iz "abc" šutke nastaje 0. Za unose je zato prava provjera funkcijom filter_var() obično bolji izbor.

Klase i sučelja u PHP-u također su tipovi. Funkcija stoga može zahtijevati da parametar bude objekt određene klase ili da ispunjava određeno sučelje. Kako klase, sučelja i enumi surađuju, objašnjava stranica Objektno orijentirano programiranje u PHP-u.

Deklaracije tipova: od PHP-a 7.1 do 8.3

Deklaracije tipova određuju koje vrijednosti funkcija prima i vraća. Sustav tipova rastao je kroz mnoge verzije. Prema zapisniku promjena u priručniku dodane su, među ostalim, ove mogućnosti:

Verzija Novo
7.1.0 nullable tipovi (?int), void, iterable
7.2.0 object
7.4.0 tipizirana svojstva klasa
8.0.0 union tipovi (više dopuštenih tipova u jednoj oznaci), mixed, povratni tip static
8.1.0 intersection tipovi (A&B), povratni tip never
8.2.0 DNF tipovi, literalni tip true, null i false kao samostalni tipovi
8.3.0 tipizirane konstante klasa, sučelja, traitova i enuma

DNF označava disjunktivnu normalnu formu i dopušta kombinacije poput (A&B)|null. Tko planira PHP verzije, iz ove tablice vidi i koja jezična sredstva aplikacija zahtijeva.

strict_types: pretvaranje ili TypeError

Bez dodatnih oznaka PHP radi u načinu s pretvaranjem. Funkcija s int parametrima tada prihvaća i 1.5 te od toga stvara 1; od PHP-a 8.1 to je pretvaranje s gubitkom označeno kao zastarjelo. S declare(strict_types=1) na početku datoteke PHP umjesto toga baca 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, umjesto šutljivog 3

Važne su dvije finese. Prvo, strict_types vrijedi za pozive iz datoteke u kojoj stoji, a ne za tamo definirane funkcije. Ako datoteka bez strict_types poziva istu funkciju, vrijednosti se pretvaraju. Drugo, cijeli broj je tamo gdje se očekuje decimalni dopušten i u strogom načinu.

Labave i stroge usporedbe

Operator == uspoređuje nakon pretvaranja tipova, a === uspoređuje vrijednost i tip bez pretvaranja. Priručnik u većini slučajeva preporučuje === i !== jer pravila pretvaranja nisu uvijek očita.

<?php
var_dump(0 == "a");    // PHP 7: true,  PHP 8: false
var_dump("1" == "01"); // true, oba su numerički nizovi znakova
var_dump("1" === "01");// false, isti tip, ali drugi niz znakova
var_dump(1 == true);   // true
var_dump(1 === true);  // false

S PHP-om 8.0 usporedbe između brojeva i nenumeričkih nizova znakova postale su razumnije. Starije se aplikacije nakon nadogradnje mogu ponašati drukčije, primjerice u switch blokovima. Izraz match, također uveden s PHP-om 8.0, uvijek uspoređuje strogo. Kako labave usporedbe vode do sigurnosnih ranjivosti, primjerice pri provjeri tokena ili lozinki, opisuje članak Type juggling: labave usporedbe kao sigurnosni rizik.

Tipovi, nadogradnje i PHP2Shell

Strog sustav tipova čini kod aplikacije otpornijim, ali ne štiti od pogrešaka u samom interpreteru. Ranjivosti PHP2Shella CVE-2026-109618 i CVE-2026-109619 nalaze se u upravljanju memorijom i zahtjevima u PHP-u. Otklonjene su u PHP-u 8.5.12, 8.4.27, 8.3.36 i 8.2.35; nakon toga svi PHP procesi moraju se ponovno pokrenuti.

Sustav tipova ipak ima ulogu, i to pri nadogradnji. Aplikacije koje su još na PHP-u 8.1 ili starijem od PHP projekta više ne dobivaju službena ažuriranja. Dobro tipiziran kod znatno je lakše podići na podržanu verziju jer alati rano pronalaze nespojivosti. Kod starijih projekata pomaže naša migracija na podržanu verziju PHP-a.

Savjet

Aktivirajte strict_types postupno u novim i prerađenim datotekama. Tako sigurnost tipova raste, a da se stari kod ne slomi odjednom.

Kako PHP SOS konkretno pomaže?

  • Provjeravamo koju najmanju verziju PHP-a Vaša aplikacija zahtijeva i usklađujemo je s otklonjenim verzijama.
  • Pokrećemo statičku analizu nad kodom i označavamo mjesta s labavim usporedbama u sigurnosno relevantnim provjerama.
  • Nadogradnje planiramo tako da se izmijenjena pravila usporedbe prethodno testiraju.
  • Instaliramo PHP ažuriranje, ponovno pokrećemo sve workere i dokumentiramo stanje.

Česta pitanja

Je li PHP jako ili slabo tipiziran?

PHP je dinamički tipiziran: tip varijable utvrđuje se tek tijekom izvođenja. Bez strict_types PHP po potrebi pretvara vrijednosti. S deklaracijama tipova i strict_types kod se ipak može učiniti vrlo strogim.

Što postiže declare(strict_types=1)?

Isključuje automatsko pretvaranje skalarnih vrijednosti za pozive iz dotične datoteke. Ako vrijednost ne odgovara deklariranom tipu, PHP baca TypeError. Jedina je iznimka cijeli broj tamo gdje se očekuje decimalni.

Zašto je 0 == "a" u PHP-u 8 netočno, a u PHP-u 7 točno?

Do PHP-a 7 nenumerički niz znakova pri usporedbi s brojem pretvarao se u broj, pa je "a" postajao 0. Od PHP-a 8.0 PHP u tom slučaju više ne uspoređuje numerički, a rezultat je false.

Štite li tipovi od sigurnosnih ranjivosti u samom PHP-u?

Ne. Tipovi sprječavaju pogreške u kodu Vaše aplikacije. Ranjivosti u interpreteru poput PHP2Shella zatvara samo PHP ažuriranje. Moderne funkcije tipova ipak pretpostavljaju aktualne verzije PHP-a, pa su dobar povod za nadogradnju.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć