Ajankohtainen tilanne: PHP2Shell. Kaksi kriittistä PHP-haavoittuvuutta (CVSS 9.2) sallii haittakoodin suorittamisen ilman kirjautumista. Korjaukset 21.10.2026 alkaen.Mitä nyt on tehtävä →

Composer: PHP:n pakettienhallinta

Composer lataa ja hallinnoi kirjastoja, joihin modernit PHP-projektit perustuvat. Kun ymmärtää composer.jsonin, composer.lockin ja automaattisen lataajan, toimitus on toistettavampi ja turvallisempi.

Tilanne Lukuaika 4 minPHP-tietoa

Lyhyesti: Composer on PHP:n pakettienhallinta. Se lukee tiedostosta composer.json, mitä kirjastoja projekti tarvitsee, lataa ne kansioon vendor, tallentaa tarkat versiot tiedostoon composer.lock ja luo automaattisen lataajan, joka löytää luokat itse. Composer hallinnoi siis sovelluksenne koodia, ei PHP-tulkkia: Composer-päivitys ei sulje PHP:n aukkoa kuten PHP2Shell.

Mikä Composer on ja mihin sitä tarvitaan?

Tuskin mikään PHP-sovellus koostuu nykyään pelkästä omasta koodista. Kehykset, sähköpostikirjastot, PDF-tuotanto tai maksuyhteydet tulevat valmiina paketteina. Composer, PHP:n pakettienhallinta, huolehtii siitä, että nämä paketit yhdistyvät sopivissa versioissa ja että jokainen riippuvuus tuo mukanaan omat riippuvuutensa.

Päättäjälle tämä tarkoittaa: suuri osa palvelimellanne toimivasta koodista tulee kolmansilta osapuolilta. Se on tehokasta, mutta vaatii huoltoa. Ylläpitäjille ja kehittäjille tämä tarkoittaa: Composeria oikein käyttävä voi milloin tahansa jäljittää, mikä kirjaston versio tuotannossa pyörii.

Pakettien vakiolähde on Composerin dokumentaation mukaan Packagist.org. Muita lähteitä, esimerkiksi verkkotoimiston sisäisiä repositorioita, voi lisätä composer.json-tiedostoon kohdassa repositories.

composer.json, composer.lock ja vendor: kolme perusosaa

Composer toimii kolmen asian varassa, jotka kannattaa tuntea ennen kuin ottaa palvelimen haltuunsa tai tilaa toimiston.

Osa Sisältö Kuuluuko repositorioon?
composer.json halutut paketit versioväleineen (require, require-dev), automaattisen latauksen säännöt, asetukset kyllä
composer.lock kaikkien pakettien tarkasti ratkaistut versiot, myös välilliset kyllä, Composerin dokumentaation mukaan nimenomaan
vendor/ pakettien ladattu koodi ja luotu automaattinen lataaja ei, syntyy asennuksessa

Kohdassa require ovat paketit, joita sovellus tarvitsee käytössä. Kohdassa require-dev ovat kehityksen ja testauksen työkalut, esimerkiksi testikehykset tai staattinen analyysi. Tämä erottelu on tärkeä, koska kehitystyökaluilla ei ole mitään asiaa tuotantopalvelimelle.

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

Esimerkin versiotiedot on valittu vain havainnollistamiseksi. Mitä versioita projektinne tarvitsee, riippuu sen vaatimuksista.

install vai update: ero käytössä

Kaksi komentoa kuulostavat samanlaisilta, mutta niiden seuraukset ovat hyvin erilaiset.

  • composer install lukee tiedoston composer.lock ja asentaa täsmälleen siihen tallennetut versiot. Se on toistettavaa ja kuuluu toimitukseen.
  • composer update ratkaisee kaikki riippuvuudet uudelleen, hakee uusimmat sopivat versiot ja kirjoittaa composer.lock-tiedoston uudelleen. Se kuuluu kehitykseen, ja sen jälkeen ajetaan testit.

Composerin dokumentaation mukaan update suorittaa lukitustiedoston kirjoittamisen jälkeen lisäksi tietoturvatarkistuksen (audit), ellei sitä sammuteta valinnalla --no-audit. install ei tarkista oletuksena; sitä varten on valinta --audit.

Automaattinen lataus: miten Composer löytää luokat

Composer luo tiedoston vendor/autoload.php. Kun se on kerran liitetty mukaan, PHP lataa jokaisen luokan vasta kun sitä tarvitaan. Omalle koodille kohdassa autoload määritetään, mikä nimiavaruus sijaitsee missäkin kansiossa. Suositus on PSR-4, PHP-FIG:n standardi. Miten se tarkalleen toimii, selittää sivu Nimiavaruudet ja automaattinen lataus; yleiskatsauksen kaikista standardeista antaa sivu PSR-standardit.

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

$log = new Monolog\Logger('app');   // ladataan tarvittaessa automaattisesti

Composer tuotannossa: toimitus siististi

Toimitukseen on vakiintunut kiinteä järjestys. Se ajetaan parhaiten build-putkessa eikä käsin palvelimella.

  1. Lukitustiedoston tarkistus: composer validate varmistaa, että composer.json on kelvollinen ja composer.lock ajan tasalla.
  2. Asennus ilman kehityspaketteja: composer install --no-dev jättää require-dev-paketit pois.
  3. Automaattisen lataajan optimointi: --optimize-autoloader (lyhyesti -o) muuntaa säännöt luokkaluetteloksi. Valinnalla --classmap-authoritative PHP lataa luokat yksinomaan tästä luettelosta.
  4. Tietoturvatarkistus: composer audit --locked tarkistaa lukitustiedoston versiot tunnettuja tietoturvailmoituksia vasten ja ilmoittaa hylätyistä paketeista.
  5. vendor verkkojuuren ulkopuolella: Vain julkisen kansion, jossa on sisääntulokomentosarja, tulee olla tavoitettavissa URL:n kautta.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev

composer outdated näyttää lisäksi, millä asennetuilla paketeilla on uudempia versioita. Se on perusta suunnitelluille päivityksille kiireisten yksittäistoimien sijaan.

Composer, tietoturva ja PHP2Shell

Composer ja PHP2Shell koskevat kahta eri tasoa. Haavoittuvuudet CVE-2026-109618 ja CVE-2026-109619 ovat itse PHP-tulkissa. Ne on korjattu versioissa PHP 8.5.12, 8.4.27, 8.3.36 ja 8.2.35, ja kaikki PHP-prosessit on sen jälkeen käynnistettävä uudelleen. Mikään composer update eikä mikään paketti kansiossa vendor muuta tätä.

Silti Composer kuuluu jokaiseen poikkeaman jälkeiseen tarkistukseen. Joka tuo haittakoodin palvelimelle, voi muuttaa myös kansion vendor tiedostoja, ja vendor/autoload.php ladataan jokaisella pyynnöllä. Tuore composer install tarkistetusta lukitustiedostosta tyhjään hakemistoon on siksi hyvä tapa palauttaa pakettikanta. Miten riippuvuudet tarkistetaan säännöllisesti tunnettujen aukkojen varalta, kuvaa opas composer audit.

Tärkeää

Vihreä composer audit ei kerro mitään PHP:n korjaustasosta. Tarkistakaa PHP-ajoympäristö erikseen, esimerkiksi PHP-päivityspalvelumme avulla.

Miten PHP SOS auttaa konkreettisesti?

  • Kartoitamme jokaisesta sovelluksesta PHP-version, Composer-paketit ja lukitustilan ja erotamme siististi tulkin ja kirjastot toisistaan.
  • Tarkistamme, sopivatko vendor ja lukitustiedosto yhteen ja onko tuotannossa kehityspaketteja tai muutettuja tiedostoja.
  • Otamme käyttöön toistettavan toimituksen komennolla install --no-dev, optimoidulla automaattisella lataajalla ja auditilla.
  • Poikkeaman jälkeen palautamme pakettikannan tarkistetusta lukitustiedostosta ja dokumentoimme tuloksen.

Usein kysytyt kysymykset

Pitääkö composer.lock viedä Git-repositorioon?

Kyllä. Composerin dokumentaatio suosittelee nimenomaan composer.lock-tiedoston commitointia. Vain siten kehitys, CI ja tuotanto asentavat täsmälleen samat pakettiversiot.

Mikä ero on komennoilla composer install ja composer update?

install asentaa versiot, jotka on tallennettu composer.lock-tiedostoon. update ratkaisee riippuvuudet uudelleen, hakee sopivat uudemmat versiot ja kirjoittaa composer.lockin uudelleen. Tuotantopalvelimelle kuuluu vain install.

Sulkeeko Composer-päivitys PHP2Shell-aukon?

Ei. Composer hallinnoi sovelluksenne kirjastoja, ei PHP-tulkkia. PHP2Shell suljetaan vain päivittämällä PHP-ajoympäristö korjattuun versioon ja käynnistämällä kaikki PHP-prosessit uudelleen.

Missä vendor-kansion pitäisi sijaita?

Ihannetapauksessa julkisesti tavoitettavan verkkohakemiston ulkopuolella. Monet kehykset sijoittavat verkkojuureen vain public-kansion, kun taas vendor on yhtä tasoa ylempänä.

Lähteet

Pikayhteys

Jokainen tunti on tärkeä. Kirjoittakaa meille nyt.

Kuvatkaa lyhyesti järjestelmä, PHP-versio ja havainnot. Otamme yhteyttä, selvitämme tilanteen ja työskentelemme etänä, kunnes tapaus on käsitelty loppuun ja dokumentoitu.

Pikaapu