Ukratko: PSR-ovi (PHP Standards Recommendations) standardi su PHP-FIG-a, skupine uglednih PHP projekata. Određuju zajednička pravila i sučelja, primjerice PSR-4 za autoloading, PSR-3 za loggere, PSR-7 za HTTP poruke i PSR-11 za containere. Svaki PSR ima status: prihvaćen, nacrt, zastario ili napušten. PSR-ovi kod čine zamjenjivijim i lakšim za provjeru, ali ne zatvaraju ranjivosti u PHP interpreteru poput PHP2Shella.
Što su PHP-FIG i PSR-ovi?
PHP-FIG označava PHP Framework Interop Group. Skupina svoj cilj sama opisuje kao unapređivanje PHP-a suradnjom i standardima. Iza PSR-a dakle ne stoji proizvođač, nego dogovor među projektima koji svoj softver žele održati međusobno kompatibilnim.
Za donositelje odluka korist je opipljiva: ako se aplikacija drži PSR sučelja, biblioteku za zapisivanje moguće je zamijeniti bez diranja cijelog koda. To smanjuje ovisnost o pojedinim paketima i pružateljima usluga.
Put jednog PSR-a: od Pre-Drafta do Accepteda
Statut PHP-FIG-a opisuje čvrst slijed:
- Pre-Draft: Utvrđuje se postoji li dovoljno interesa. Formira se radna skupina, a nakon uspješnog glasanja prijedlog dobiva PSR broj.
- Draft: Prijedlog se razrađuje, alternative i obrazloženja unose se u meta-dokument.
- Review: Zajednica testira specifikaciju probnim implementacijama, najmanje četiri tjedna i dok ne postoje dvije neovisne, održive izvedbe.
- Accepted: Nakon uspješnog glasanja PSR je prihvaćen; radna se skupina raspušta.
Uz to postoje još dva stanja. Deprecated znači: prihvaćen, ali se više ne preporučuje, najčešće jer ga zamjenjuje noviji standard. Abandoned znači: na njemu se više ne radi.
Svi PSR-ovi sa statusom
Stanje prema pregledu PHP-FIG-a u trenutku nastanka ove stranice:
| Br. | Naslov | Status |
|---|---|---|
| PSR-0 | Autoloading Standard | zastario |
| PSR-1 | Basic Coding Standard | prihvaćen |
| PSR-2 | Coding Style Guide | zastario |
| PSR-3 | Logger Interface | prihvaćen |
| PSR-4 | Autoloading Standard | prihvaćen |
| PSR-5 | PHPDoc Standard | nacrt |
| PSR-6 | Caching Interface | prihvaćen |
| PSR-7 | HTTP Message Interface | prihvaćen |
| PSR-8 | Huggable Interface | napušten |
| PSR-9 | Security Advisories | napušten |
| PSR-10 | Security Reporting Process | napušten |
| PSR-11 | Container Interface | prihvaćen |
| PSR-12 | Extended Coding Style Guide | prihvaćen |
| PSR-13 | Hypermedia Links | prihvaćen |
| PSR-14 | Event Dispatcher | prihvaćen |
| PSR-15 | HTTP Handlers | prihvaćen |
| PSR-16 | Simple Cache | prihvaćen |
| PSR-17 | HTTP Factories | prihvaćen |
| PSR-18 | HTTP Client | prihvaćen |
| PSR-19 | PHPDoc tags | nacrt |
| PSR-20 | Clock | prihvaćen |
| PSR-21 | Internationalization | nacrt |
| PSR-22 | Application Tracing | nacrt |
Najvažniji PSR-ovi za praksu
- PSR-4 (autoloading): preslikava nazive klasa na putanje datoteka i temelj je Composerova autoloadera. Pojedinosti na stranici Namespaceovi i autoloading.
- PSR-1 i PER Coding Style: zajednička pravila za pisanje i oblikovanje. PER Coding Style prema PHP-FIG-u proširuje i zamjenjuje PSR-12 te pretpostavlja PSR-1.
- PSR-3 (logger): jedinstveno sučelje loggera u namespaceu
Psr\Logs osam razina odemergencydodebug. - PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): sučelja za zahtjeve i odgovore, middleware, tvornice i HTTP klijente. Mnogi PHP frameworci na njima se temelje ili nude mostove.
- PSR-11 (container): zajedničko sučelje za dependency injection containere.
- PSR-6 i PSR-16 (cache): dva sučelja za privremenu pohranu, jedno opširno i jedno jednostavno.
- PSR-14 i PSR-20 (događaji, sat): zajednička sučelja za događaje i za trenutačno vrijeme. Zamjenjiv sat kod ovisan o vremenu, primjerice istek tokena, čini dobro provjerljivim.
Brojevi, usput, ništa ne govore o važnosti. Dodjeljuju se pri ulasku u fazu nacrta, zato zastarjeli i napušteni prijedlozi stoje među važnim, prihvaćenim standardima.
<?php
use Psr\Log\LoggerInterface;
final class Bestellimport
{
public function __construct(private LoggerInterface $log) {}
public function importieren(string $datei): void
{
try {
// ... obrada datoteke ...
} catch (\Throwable $e) {
$this->log->error('Import von {datei} fehlgeschlagen', [
'datei' => basename($datei),
'exception' => $e,
]);
}
}
}
Što PSR-ovi imaju sa sigurnošću
Nekoliko standarda izravno dotiče sigurnost. PSR-3 određuje da se iznimke u kontekstu predaju pod ključem exception te da se rezervirana mjesta poput {datei} zamjenjuju iz konteksta. Vrijednosti se pritom ne smiju unaprijed maskirati jer logger ne zna gdje će se kasnije prikazivati. Tko zapisnike prikazuje u web-sučelju, mora ih maskirati ondje. Više u članku Sigurno zapisivanje.
PSR-7 opisuje HTTP poruke kao nepromjenjive objekte i pomoću UploadedFileInterface::moveTo() nudi jedinstven put za spremanje učitanih datoteka. Specifikacija zahtijeva da je izvorna datoteka nakon toga uklonjena. Provjera vrste datoteke i odredišta ostaje zadaća aplikacije.
Vrijedi istaknuti da su PSR-9 (Security Advisories) i PSR-10 (Security Reporting Process) napušteni. Zajedničkog standarda za sigurnosne obavijesti tako nema; svaki projekt to uređuje sam. Kako sâm PHP projekt postupa s ranjivostima, opisuje stranica Kako PHP projekt postupa sa sigurnosnim ranjivostima.
Protiv PHP2Shella standardi ne pomažu: ranjivosti CVE-2026-109618 i CVE-2026-109619 nalaze se u interpreteru. Obvezni su ažuriranje na PHP 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 i ponovno pokretanje svih PHP procesa.
Kako PHP SOS konkretno pomaže?
- Provjeravamo kako Vaša aplikacija zapisuje i osiguravamo da iznimke završavaju u zapisniku, ali ne i pristupni podaci ili oznake sesija.
- Procjenjujemo kako su izvedeni upload i HTTP obrada, i kad se odvijaju preko PSR-7 biblioteka.
- Vlastite razvoje istražujemo u okviru sigurnosnog audita i penetracijskog testa.
- Instaliramo PHP ažuriranja, ponovno pokrećemo sve workere i dokumentiramo stanje.
Česta pitanja
Što znači PSR?
PSR označava PHP Standards Recommendation. Preporuke izrađuje i usklađuje PHP-FIG, PHP Framework Interop Group. Dobrovoljne su, ali ih provodi mnogo frameworka i biblioteka.
Vrijedi li PSR-12 još?
PSR-12 u PHP-FIG-u i dalje vodi status prihvaćenog. PHP-FIG je ipak objavio nasljednika, PER Coding Style, koji prema vlastitim riječima proširuje i zamjenjuje PSR-12. Trenutačna je ondje verzija 3.1.
Postoji li PSR za sigurnosne obavijesti?
Postojala su dva prijedloga: PSR-9 za sigurnosne obavijesti (security advisories) i PSR-10 za postupak prijave sigurnosnih ranjivosti. Oba su u PHP-FIG-u vođena kao napuštena. Projekti zato sami uređuju svoj postupak prijave.
Mora li moj projekt poštovati PSR-ove?
Ne, nema obveze. PSR-4 za autoloading te sučelja poput PSR-3 ili PSR-7 ipak znatno olakšavaju uporabu stranih paketa i promjenu pružatelja usluga.