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 →

Composer: PHP paketų tvarkyklė

Composer atsisiunčia ir valdo bibliotekas, kuriomis remiasi šiuolaikiniai PHP projektai. Kas supranta composer.json, composer.lock ir automatinį įkėlimą, diegia atkuriamai ir saugiau.

Būsena 4 min. skaitymoPHP žinios

Trumpai: Composer yra PHP paketų tvarkyklė. Ji iš failo composer.json nuskaito, kokių bibliotekų reikia projektui, atsisiunčia jas į aplanką vendor, tikslias versijas užfiksuoja composer.lock ir sukuria automatinį klasių įkėlėją (autoloader), kuris klases randa pats. Taigi Composer valdo jūsų programos kodą, o ne patį PHP interpretatorių: Composer atnaujinimas neuždaro tokios PHP spragos kaip PHP2Shell.

Kas yra Composer ir kam jo reikia?

Šiandien vargu ar rasite PHP programą, sudarytą tik iš savo kodo. Karkasai, pašto bibliotekos, PDF kūrimas ar mokėjimų integracijos ateina kaip paruošti paketai. Composer, PHP paketų tvarkyklė, pasirūpina, kad šie paketai susidėtų tinkamomis versijomis ir kad kiekviena priklausomybė atsineštų savo priklausomybes.

Sprendimų priėmėjams tai reiškia: didelė dalis jūsų serveryje veikiančio kodo yra iš trečiųjų šalių. Tai efektyvu, bet reikalauja priežiūros. Administratoriams ir kūrėjams tai reiškia: kas Composer naudoja tvarkingai, bet kada gali atsekti, kokia kurios bibliotekos versija veikia gamyboje.

Pasak Composer dokumentacijos, standartinis paketų šaltinis yra Packagist.org. Kitus šaltinius, pavyzdžiui, vidines agentūros saugyklas, galima įrašyti composer.json skiltyje repositories.

composer.json, composer.lock ir vendor: trys dalys

Composer dirba su trimis dalykais, kuriuos verta žinoti prieš perimant serverį ar užsakant agentūrai.

Dalis Turinys Ar priklauso saugyklai?
composer.json pageidaujami paketai su versijų intervalais (require, require-dev), automatinio įkėlimo taisyklės, nustatymai taip
composer.lock tiksliai išspręstos visų paketų versijos, taip pat netiesioginių taip, pasak Composer dok. aiškiai
vendor/ atsisiųstas paketų kodas ir sukurtas automatinis įkėlėjas ne, sukuriamas diegiant

Skiltyje require yra paketai, kurių programai reikia veikiant. Skiltyje require-dev yra kūrimo ir testavimo įrankiai, pavyzdžiui, testavimo karkasai ar statinė analizė. Šis atskyrimas svarbus, nes kūrimo įrankiams gamybos serveryje nėra vietos.

{
    "require": {
        "php": ">=8.3",
        "monolog/monolog": "^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0"
    },
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}

Pavyzdžio versijų nurodymai pasirinkti tik iliustracijai. Kokių versijų reikia jūsų projektui, išplaukia iš jo reikalavimų.

install ar update: skirtumas eksploatuojant

Abi komandos skamba panašiai, bet turi labai skirtingas pasekmes.

  • composer install nuskaito composer.lock ir įdiegia lygiai ten užfiksuotas versijas. Tai atkuriama ir priklauso pateikimui.
  • composer update iš naujo išsprendžia visas priklausomybes, atsisiunčia naujausias tinkamas versijas ir perrašo composer.lock. Tai priklauso kūrimui, su vėlesniais testais.

Pasak Composer dokumentacijos, update po lock failo įrašymo papildomai atlieka saugumo patikrą (auditą), nebent ji išjungta su --no-audit. install pagal numatymą netikrina; tam yra parinktis --audit.

Automatinis įkėlimas: kaip Composer randa klases

Composer sukuria failą vendor/autoload.php. Kai jis kartą įtraukiamas, PHP kiekvieną klasę įkelia tik tada, kai jos prireikia. Savam kodui skiltyje autoload nustatoma, kuri vardų erdvė kuriame aplanke yra. Tam rekomenduojamas PSR-4, PHP-FIG standartas. Kaip tai veikia tiksliai, paaiškina puslapis Vardų erdvės ir automatinis įkėlimas; visų standartų apžvalgą pateikia puslapis PSR standartai.

<?php
require __DIR__ . '/../vendor/autoload.php';

$log = new Monolog\Logger('app');   // prireikus įkeliama automatiškai

Composer gamyboje: tvarkingas pateikimas

Pateikimui prigijo nustatyta eilės tvarka. Geriausia ją vykdyti kūrimo konvejeryje (build pipeline), o ne rankiniu būdu serveryje.

  1. Patikrinti lock failą: composer validate užtikrina, kad composer.json galioja, o composer.lock aktualus.
  2. Diegti be kūrimo paketų: composer install --no-dev praleidžia require-dev.
  3. Optimizuoti automatinį įkėlėją: --optimize-autoloader (trumpai -o) paverčia taisykles klasių sąrašu. Su --classmap-authoritative PHP klases įkelia tik iš šio sąrašo.
  4. Saugumo patikra: composer audit --locked tikrina lock faile esančias versijas pagal žinomus saugumo pranešimus ir praneša apie paliktus paketus.
  5. vendor už žiniatinklio šaknies: per URL turėtų būti pasiekiamas tik viešasis aplankas su įėjimo skriptu.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev

composer outdated papildomai parodo, kurie įdiegti paketai turi naujesnių versijų. Tai planuojamų atnaujinimų pagrindas vietoj skubotų pavienių veiksmų.

Composer, saugumas ir PHP2Shell

Composer ir PHP2Shell liečia du skirtingus lygius. Spragos CVE-2026-109618 ir CVE-2026-109619 yra pačiame PHP interpretatoriuje. Ištaisytos PHP 8.5.12, 8.4.27, 8.3.36 ir 8.2.35, ir po to visi PHP procesai turi būti paleisti iš naujo. Joks composer update ir joks paketas vendor to nekeičia.

Vis dėlto Composer priklauso kiekvienai patikrai po incidento. Kas patalpina kenkėjišką kodą serveryje, gali pakeisti ir failus vendor, o vendor/autoload.php įkeliamas per kiekvieną užklausą. Todėl šviežias composer install iš patikrinto lock failo į tuščią katalogą yra geras būdas atkurti paketų rinkinį. Kaip reguliariai tikrinti priklausomybes dėl žinomų spragų, aprašo vadovas composer audit.

Svarbu

Žalias composer audit nieko nesako apie PHP pataisų būseną. PHP vykdymo aplinką tikrinkite atskirai, pavyzdžiui, mūsų PHP pataisų paslauga.

Kaip PHP SOS padeda konkrečiai?

  • Kiekvienai programai surenkame PHP versiją, Composer paketus ir lock būseną, aiškiai atskirdami interpretatorių nuo bibliotekų.
  • Tikriname, ar vendor ir lock failas dera tarpusavyje ir ar gamyboje nėra kūrimo paketų ar pakeistų failų.
  • Įrengiame atkuriamą pateikimą su install --no-dev, optimizuotu automatiniu įkėlėju ir auditu.
  • Po incidento paketų rinkinį iš naujo atkuriame iš patikrinto lock failo ir dokumentuojame rezultatą.

Dažni klausimai

Ar composer.lock turi būti Git saugykloje?

Taip. Composer dokumentacija aiškiai rekomenduoja įtraukti composer.lock į saugyklą (commit). Tik taip kūrimo aplinka, CI ir gamyba įdiegia lygiai tas pačias paketų versijas.

Kuo skiriasi composer install ir composer update?

install įdiegia versijas, užfiksuotas composer.lock. update iš naujo išsprendžia priklausomybes, atsisiunčia tinkamas naujesnes versijas ir perrašo composer.lock. Gamybos serveryje turi būti tik install.

Ar Composer atnaujinimas uždaro PHP2Shell spragą?

Ne. Composer valdo jūsų programos bibliotekas, o ne PHP interpretatorių. PHP2Shell uždaroma tik atnaujinus PHP vykdymo aplinką iki ištaisytos versijos ir iš naujo paleidus visus PHP procesus.

Kur turėtų būti vendor aplankas?

Idealiu atveju už viešai pasiekiamo žiniatinklio katalogo ribų. Daugelis karkasų į žiniatinklio šaknį deda tik public aplanką, o vendor yra vienu lygiu aukščiau.

Š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