Situazione attuale: PHP2Shell. Due vulnerabilità critiche di PHP (CVSS 9,2) consentono codice dannoso senza autenticazione. Patch dal 21/10/2026.Che cosa fare ora →

Composer: il gestore di pacchetti per PHP

Composer scarica e gestisce le librerie su cui si basano i moderni progetti PHP. Chi capisce composer.json, composer.lock e l'autoloader consegna in modo riproducibile e più sicuro.

Stato 5 min di letturaConoscere PHP

In breve: Composer è il gestore di pacchetti per PHP. Legge dal file composer.json quali librerie servono a un progetto, le scarica nella cartella vendor, registra le versioni esatte in composer.lock e genera un autoloader che trova automaticamente le classi. Composer gestisce dunque il codice della Sua applicazione, non l'interprete PHP stesso: un aggiornamento di Composer non chiude alcuna vulnerabilità di PHP come PHP2Shell.

Che cos'è Composer e a che cosa serve?

Oggi quasi nessuna applicazione PHP è fatta solo di codice proprio. Framework, librerie per la posta, generazione di PDF o collegamenti ai pagamenti arrivano come pacchetti già pronti. Composer, il gestore di pacchetti per PHP, fa sì che questi pacchetti si combinino in versioni adatte e che ogni dipendenza porti con sé le proprie dipendenze.

Per chi decide significa: gran parte del codice che gira sul Suo server proviene da terzi. È efficiente, ma richiede manutenzione. Per amministratori e sviluppatori significa: chi usa Composer in modo pulito può sempre ricostruire quale versione di quale libreria giri in produzione.

La fonte standard dei pacchetti è, secondo la documentazione di Composer, Packagist.org. Altre fonti, ad esempio repository interni di un'agenzia, si possono inserire nel composer.json sotto repositories.

composer.json, composer.lock e vendor: i tre componenti

Composer lavora con tre elementi che conviene conoscere prima di rilevare un server o di incaricare un'agenzia.

Componente Contenuto Va nel repository?
composer.json pacchetti desiderati con intervalli di versione (require, require-dev), regole di autoload, impostazioni sì
composer.lock versioni risolte esattamente di tutti i pacchetti, anche indiretti sì, secondo la documentazione di Composer espressamente
vendor/ codice scaricato dei pacchetti e autoloader generato no, viene generato durante l'installazione

Sotto require stanno i pacchetti di cui l'applicazione ha bisogno in esercizio. Sotto require-dev stanno gli strumenti per sviluppo e test, ad esempio framework di test o analisi statica. Questa separazione è importante perché gli strumenti di sviluppo non hanno nulla da fare su un server di produzione.

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

Le indicazioni di versione nell'esempio sono scelte solo a scopo illustrativo. Quali versioni servano al Suo progetto dipende dai suoi requisiti.

install o update: la differenza in esercizio

I due comandi suonano simili, ma hanno conseguenze molto diverse.

  • composer install legge composer.lock e installa esattamente le versioni lì registrate. È riproducibile e appartiene alla consegna.
  • composer update risolve di nuovo tutte le dipendenze, recupera le versioni adatte più recenti e riscrive composer.lock. Appartiene allo sviluppo, con test successivi.

Secondo la documentazione di Composer, update esegue dopo aver scritto il file lock anche una verifica di sicurezza (audit), a meno che non venga disattivata con --no-audit. install per impostazione predefinita non la esegue; a questo scopo esiste l'opzione --audit.

Autoloading: come Composer trova le classi

Composer genera il file vendor/autoload.php. Una volta incluso, PHP carica ogni classe solo quando serve. Per il codice proprio nella sezione autoload si stabilisce quale namespace stia in quale cartella. Per questo si raccomanda PSR-4, uno standard del PHP-FIG. Come funziona esattamente lo spiega la pagina Namespace e autoloading; un quadro di tutti gli standard è nella pagina Standard PSR.

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

$log = new Monolog\Logger('app');   // viene caricata automaticamente quando serve

Composer in produzione: consegnare in modo pulito

Per la consegna si è affermato un ordine fisso. Funziona al meglio in una pipeline di build e non a mano sul server.

  1. Verificare il file lock: composer validate assicura che composer.json sia valido e composer.lock aggiornato.
  2. Installare senza pacchetti di sviluppo: composer install --no-dev omette require-dev.
  3. Ottimizzare l'autoloader: --optimize-autoloader (in breve -o) trasforma le regole in un elenco di classi. Con --classmap-authoritative PHP carica le classi esclusivamente da questo elenco.
  4. Verifica di sicurezza: composer audit --locked controlla le versioni del file lock rispetto alle segnalazioni di sicurezza note e segnala i pacchetti abbandonati.
  5. vendor fuori dal webroot: solo la cartella pubblica con lo script di ingresso dovrebbe essere raggiungibile via URL.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev

composer outdated mostra inoltre quali pacchetti installati hanno versioni più recenti. È la base per aggiornamenti pianificati invece di azioni singole e frettolose.

Composer, sicurezza e PHP2Shell

Composer e PHP2Shell riguardano due livelli diversi. Le vulnerabilità CVE-2026-109618 e CVE-2026-109619 si trovano nell'interprete PHP stesso. Sono corrette in PHP 8.5.12, 8.4.27, 8.3.36 e 8.2.35, e dopo tutti i processi PHP vanno riavviati. Nessun composer update e nessun pacchetto in vendor cambia nulla in proposito.

Ciononostante Composer rientra in ogni verifica dopo un incidente. Chi porta codice dannoso su un server può anche modificare file in vendor, e vendor/autoload.php viene caricato a ogni richiesta. Un composer install pulito dal file lock verificato in una directory vuota è perciò un buon metodo per ripristinare l'insieme dei pacchetti. Come controllare regolarmente le dipendenze alla ricerca di vulnerabilità note lo descrive la guida composer audit.

Importante

Un composer audit senza segnalazioni non dice nulla sullo stato di patch di PHP. Verifichi il runtime PHP separatamente, ad esempio con il nostro servizio di patch PHP.

Come aiuta concretamente PHP SOS?

  • Rileviamo per ogni applicazione versione di PHP, pacchetti Composer e stato del file lock, separando nettamente interprete e librerie.
  • Verifichiamo se vendor e file lock corrispondono e se in produzione si trovano pacchetti di sviluppo o file modificati.
  • Impostiamo una consegna riproducibile con install --no-dev, autoloader ottimizzato e audit.
  • Dopo un incidente ripristiniamo l'insieme dei pacchetti dal file lock verificato e documentiamo il risultato.

Domande frequenti

Il file composer.lock deve andare nel repository Git?

Sì. La documentazione di Composer raccomanda espressamente di fare il commit di composer.lock. Solo così sviluppo, CI e produzione installano esattamente le stesse versioni dei pacchetti.

Qual è la differenza tra composer install e composer update?

install installa le versioni registrate in composer.lock. update risolve di nuovo le dipendenze, recupera versioni più recenti adatte e riscrive composer.lock. Sul server di produzione va usato solo install.

Un aggiornamento di Composer chiude la vulnerabilità PHP2Shell?

No. Composer gestisce le librerie della Sua applicazione, non l'interprete PHP. PHP2Shell si chiude solo con l'aggiornamento del runtime PHP a una versione corretta e il riavvio di tutti i processi PHP.

Dove dovrebbe stare la cartella vendor?

Idealmente fuori dalla directory web raggiungibile pubblicamente. Molti framework mettono nel webroot solo una cartella public, mentre vendor sta un livello più in alto.

Fonti

Contatto immediato

Ogni ora conta. Ci scriva adesso.

Descriva brevemente sistema, versione di PHP e quanto osservato. Ci faremo sentire, chiariremo la situazione e lavoreremo da remoto fino alla chiusura e alla documentazione dell'incidente.

Aiuto immediato