Dabartinė padėtis: PHP2Shell. Du kritiniai PHP pažeidžiamumai (CVSS 9,2) leidžia vykdyti kenkėjišką kodą be prisijungimo. Pataisos nuo 2026-10-21.Ką dabar daryti →

PHP-FIG PSR standartai

PSR yra bendri standartai, dėl kurių susitarė daug PHP projektų. Šiame puslapyje išvardyti visi PSR su būsena ir parodyta, kurie svarbūs kasdienybėje ir kur jie liečia saugumą.

Būsena 4 min. skaitymoPHP žinios

Trumpai: PSR (PHP Standards Recommendations) yra PHP-FIG, įsitvirtinusių PHP projektų grupės, standartai. Jie nustato bendras taisykles ir sąsajas, pavyzdžiui, PSR-4 autoloading, PSR-3 žurnalų rašymui, PSR-7 HTTP pranešimams ir PSR-11 konteineriams. Kiekvienas PSR turi būseną: priimtas, projektas, pasenęs arba apleistas. PSR daro kodą keičiamesnį ir lengviau tikrinamą, bet neuždaro spragų PHP interpretatoriuje, tokių kaip PHP2Shell.

Kas yra PHP-FIG ir kas yra PSR?

PHP-FIG reiškia PHP Framework Interop Group. Grupė pati savo tikslą apibūdina kaip PHP tobulinimą bendradarbiavimu ir standartais. Taigi už PSR stovi ne gamintojas, o projektų, norinčių išlaikyti savo programinės įrangos tarpusavio suderinamumą, susitarimas.

Sprendimų priėmėjams nauda apčiuopiama: jei programa laikosi PSR sąsajų, galima, pavyzdžiui, pakeisti žurnalų rašymo biblioteką, nelieskiant viso kodo. Tai mažina priklausomybę nuo atskirų paketų ir paslaugų teikėjų.

PSR kelias: nuo Pre-Draft iki Accepted

PHP-FIG įstatai aprašo nusistovėjusią eigą:

  1. Pre-Draft: išsiaiškinama, ar yra pakankamai susidomėjimo. Susidaro darbo grupė, po sėkmingo balsavimo pasiūlymas gauna PSR numerį.
  2. Draft: pasiūlymas išplėtojamas, alternatyvos ir pagrindimai patenka į meta dokumentą.
  3. Review: bendruomenė išbando specifikaciją su bandomaisiais įgyvendinimais, mažiausiai keturias savaites ir kol atsiranda du nepriklausomi, gyvybingi įgyvendinimai.
  4. Accepted: po sėkmingo balsavimo PSR priimamas; darbo grupė paleidžiama.

Be to yra dvi papildomos būsenos. Deprecated reiškia: priimtas, bet nebenerekomenduojamas, dažniausiai todėl, kad jį pakeitė naujesnis standartas. Abandoned reiškia: prie jo daugiau nedirbama.

Visi PSR su būsena

Būsena pagal PHP-FIG apžvalgą šio puslapio rengimo metu:

Nr. Pavadinimas Būsena
PSR-0 Autoloading Standard pasenęs
PSR-1 Basic Coding Standard priimtas
PSR-2 Coding Style Guide pasenęs
PSR-3 Logger Interface priimtas
PSR-4 Autoloading Standard priimtas
PSR-5 PHPDoc Standard projektas
PSR-6 Caching Interface priimtas
PSR-7 HTTP Message Interface priimtas
PSR-8 Huggable Interface apleistas
PSR-9 Security Advisories apleistas
PSR-10 Security Reporting Process apleistas
PSR-11 Container Interface priimtas
PSR-12 Extended Coding Style Guide priimtas
PSR-13 Hypermedia Links priimtas
PSR-14 Event Dispatcher priimtas
PSR-15 HTTP Handlers priimtas
PSR-16 Simple Cache priimtas
PSR-17 HTTP Factories priimtas
PSR-18 HTTP Client priimtas
PSR-19 PHPDoc tags projektas
PSR-20 Clock priimtas
PSR-21 Internationalization projektas
PSR-22 Application Tracing projektas

Svarbiausi PSR praktikai

  • PSR-4 (autoloading): susieja klasių pavadinimus su failų keliais ir yra Composer autoloader pagrindas. Išsamiau puslapyje Vardų erdvės ir autoloading.
  • PSR-1 ir PER Coding Style: bendros rašybos ir formatavimo taisyklės. Pasak PHP-FIG, PER Coding Style išplečia ir pakeičia PSR-12 ir remiasi PSR-1.
  • PSR-3 (žurnalų rašymas): vieninga žurnalų rašymo sąsaja vardų erdvėje Psr\Log su aštuoniais lygiais nuo emergency iki debug.
  • PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): sąsajos užklausoms ir atsakymams, tarpinei programinei įrangai (middleware), gamykloms ir HTTP klientams. Daug PHP karkasų remiasi jomis arba siūlo tiltus.
  • PSR-11 (konteineris): bendra sąsaja priklausomybių injekcijos konteineriams.
  • PSR-6 ir PSR-16 (talpykla): dvi sąsajos laikinajai saugyklai, viena išsami ir viena paprasta.
  • PSR-14 ir PSR-20 (įvykiai, laikrodis): bendros sąsajos įvykiams ir dabartiniam laikui. Pakeičiamas laikrodis daro nuo laiko priklausomą kodą, pavyzdžiui, žetonų galiojimo pabaigą, gerai testuojamą.

Beje, numeriai nieko nesako apie svarbą. Jie suteikiami pradedant juodraščio fazę, todėl pasenę ir apleisti pasiūlymai stovi tarp svarbių, priimtų standartų.

<?php
use Psr\Log\LoggerInterface;

final class Bestellimport
{
    public function __construct(private LoggerInterface $log) {}

    public function importieren(string $datei): void
    {
        try {
            // ... failo apdorojimas ...
        } catch (\Throwable $e) {
            $this->log->error('Import von {datei} fehlgeschlagen', [
                'datei'     => basename($datei),
                'exception' => $e,
            ]);
        }
    }
}

Ką PSR turi bendro su saugumu

Keli standartai tiesiogiai liečia saugumą. PSR-3 nustato, kad išimtys kontekste perduodamos po raktu exception, o vietos žymekliai, pavyzdžiui, {datei}, pakeičiami reikšmėmis iš konteksto. Reikšmės tuo metu neturi būti iš anksto maskuojamos, nes žurnalų rašytojas nežino, kur jos vėliau bus rodomos. Kas žurnalus rodo žiniatinklio sąsajoje, ten turi maskuoti. Daugiau straipsnyje Saugus protokolavimas.

PSR-7 aprašo HTTP pranešimus kaip nekeičiamus objektus ir su UploadedFileInterface::moveTo() siūlo vieningą būdą išsaugoti įkeltus failus. Specifikacija reikalauja, kad po to originalus failas būtų pašalintas. Failo tipo ir paskirties vietos patikra lieka programos užduotis.

Pastebėtina, kad PSR-9 (Security Advisories) ir PSR-10 (Security Reporting Process) buvo apleisti. Taigi bendro saugumo pranešimų standarto nėra; kiekvienas projektas tai reglamentuoja pats. Kaip su spragomis elgiasi pats PHP projektas, aprašo puslapis Kaip PHP projektas tvarko saugumo spragas.

Nuo PHP2Shell standartai nepadeda: spragos CVE-2026-109618 ir CVE-2026-109619 slypi interpretatoriuje. Privaloma atnaujinti iki PHP 8.5.12, 8.4.27, 8.3.36 ar 8.2.35 ir paleisti iš naujo visus PHP procesus.

Kaip PHP SOS padeda konkrečiai?

  • Tikriname, kaip jūsų programa rašo žurnalus, ir užtikriname, kad išimtys patektų į žurnalą, bet ne prieigos duomenys ar sesijų identifikatoriai.
  • Vertiname, kaip įgyvendintas įkėlimų ir HTTP apdorojimas, net jei jis vyksta per PSR-7 bibliotekas.
  • Nuosavus sprendimus tiriame pagal saugumo audito ir skverbties testo paslaugą.
  • Įdiegiame PHP atnaujinimus, paleidžiame iš naujo visus darbinius procesus (worker) ir dokumentuojame būseną.

Dažni klausimai

Ką reiškia PSR?

PSR reiškia PHP Standards Recommendation. Rekomendacijas rengia ir derina PHP-FIG, PHP Framework Interop Group. Jos neprivalomos, bet jas įgyvendina daug karkasų ir bibliotekų.

Ar PSR-12 dar galioja?

PHP-FIG PSR-12 tebelaiko priimtu. Tačiau PHP-FIG paskelbė jo įpėdinį PER Coding Style, kuris, pasak jų pačių, PSR-12 išplečia ir pakeičia. Šiuo metu ten aktuali versija 3.1.

Ar yra PSR saugumo pranešimams?

Buvo du pasiūlymai: PSR-9 saugumo pranešimams (Security Advisories) ir PSR-10 saugumo spragų pranešimo procesui. Abu PHP-FIG laikomi apleistais. Todėl projektai savo pranešimo procesą reglamentuoja patys.

Ar mano projektas privalo laikytis PSR?

Ne, tokios pareigos nėra. Tačiau PSR-4 autoloading ir sąsajos, tokios kaip PSR-3 ar PSR-7, gerokai palengvina svetimų paketų naudojimą ir paslaugų teikėjų keitimą.

Šaltiniai

Skubus kontaktas

Kiekviena valanda svarbi. Parašykite mums dabar.

Trumpai aprašykite sistemą, PHP versiją ir pastebėjimus. Mes atsakysime, išsiaiškinsime padėtį ir dirbsime nuotoliu, kol incidentas bus užbaigtas ir dokumentuotas.

Skubi pagalba