Εν συντομία: Το Composer είναι η διαχείριση πακέτων για την PHP. Διαβάζει από το αρχείο composer.json ποιες βιβλιοθήκες χρειάζεται ένα έργο, τις φορτώνει στον φάκελο vendor, καταγράφει τις ακριβείς εκδόσεις στο composer.lock και παράγει έναν autoloader που βρίσκει αυτόματα τις κλάσεις. Το Composer διαχειρίζεται έτσι τον κώδικα της εφαρμογής σας, όχι τον ίδιο τον διερμηνέα PHP: μια ενημέρωση του Composer δεν κλείνει ευπάθεια της PHP όπως το PHP2Shell.
Τι είναι το Composer και σε τι χρησιμεύει;
Σχεδόν καμία εφαρμογή PHP δεν αποτελείται σήμερα μόνο από δικό της κώδικα. Frameworks, βιβλιοθήκες αλληλογραφίας, δημιουργία PDF ή συνδέσεις πληρωμών προστίθενται ως έτοιμα πακέτα. Το Composer, η διαχείριση πακέτων της PHP, φροντίζει ώστε αυτά τα πακέτα να συνυπάρχουν σε κατάλληλες εκδόσεις και ώστε κάθε εξάρτηση να φέρνει μαζί της τις δικές της εξαρτήσεις.
Για όσους αποφασίζουν αυτό σημαίνει: ένα μεγάλο μέρος του κώδικα που εκτελείται στον διακομιστή σας προέρχεται από τρίτους. Αυτό είναι αποδοτικό, απαιτεί όμως συντήρηση. Για διαχειριστές και προγραμματιστές σημαίνει: όποιος χρησιμοποιεί σωστά το Composer, μπορεί ανά πάσα στιγμή να παρακολουθήσει ποια έκδοση ποιας βιβλιοθήκης εκτελείται στην παραγωγή.
Η προεπιλεγμένη πηγή πακέτων είναι σύμφωνα με την τεκμηρίωση του Composer το Packagist.org. Άλλες πηγές, για παράδειγμα εσωτερικά αποθετήρια μιας εταιρείας ανάπτυξης, μπορούν να καταχωριστούν στο composer.json κάτω από το repositories.
composer.json, composer.lock και vendor: τα τρία δομικά στοιχεία
Το Composer εργάζεται με τρία πράγματα που πρέπει κανείς να γνωρίζει προτού αναλάβει έναν διακομιστή ή αναθέσει έργο σε εταιρεία ανάπτυξης.
| Στοιχείο | Περιεχόμενο | Ανήκει στο αποθετήριο; |
|---|---|---|
composer.json |
επιθυμητά πακέτα με εύρη εκδόσεων (require, require-dev), κανόνες autoload, ρυθμίσεις |
ναι |
composer.lock |
ακριβώς επιλυμένες εκδόσεις όλων των πακέτων, και των έμμεσων | ναι, σύμφωνα με την τεκμηρίωση του Composer ρητά |
vendor/ |
κατεβασμένος κώδικας των πακέτων και ο παραγόμενος autoloader | όχι, δημιουργείται κατά την εγκατάσταση |
Κάτω από το require βρίσκονται πακέτα που η εφαρμογή χρειάζεται στη λειτουργία. Κάτω από το require-dev βρίσκονται εργαλεία για ανάπτυξη και δοκιμές, για παράδειγμα frameworks δοκιμών ή στατική ανάλυση. Αυτός ο διαχωρισμός είναι σημαντικός, επειδή τα εργαλεία ανάπτυξης δεν έχουν καμία δουλειά σε έναν διακομιστή παραγωγής.
{
"require": {
"php": ">=8.3",
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
Οι αναφορές εκδόσεων στο παράδειγμα επιλέχθηκαν μόνο για παραστατικότητα. Ποιες εκδόσεις χρειάζεται το έργο σας, προκύπτει από τις απαιτήσεις του.
install ή update: η διαφορά στη λειτουργία
Οι δύο εντολές ακούγονται παρόμοιες, έχουν όμως πολύ διαφορετικές συνέπειες.
- Το
composer installδιαβάζει τοcomposer.lockκαι εγκαθιστά ακριβώς τις εκδόσεις που είναι καταγεγραμμένες εκεί. Αυτό είναι αναπαραγώγιμο και ανήκει στην παράδοση. - Το
composer updateεπιλύει εκ νέου όλες τις εξαρτήσεις, φέρνει τις νεότερες κατάλληλες εκδόσεις και ξαναγράφει τοcomposer.lock. Αυτό ανήκει στην ανάπτυξη, με επακόλουθες δοκιμές.
Σύμφωνα με την τεκμηρίωση του Composer, το update εκτελεί μετά την εγγραφή του αρχείου lock επιπλέον έναν έλεγχο ασφαλείας (audit), εφόσον δεν απενεργοποιηθεί με --no-audit. Το install δεν ελέγχει από προεπιλογή· γι' αυτό υπάρχει η επιλογή --audit.
Autoloading: πώς βρίσκει το Composer τις κλάσεις
Το Composer δημιουργεί το αρχείο vendor/autoload.php. Μόλις συμπεριληφθεί μία φορά, η PHP φορτώνει κάθε κλάση μόνο όταν χρειάζεται. Για τον δικό σας κώδικα ορίζεται στην ενότητα autoload ποιο namespace βρίσκεται σε ποιον φάκελο. Συνιστάται το PSR-4, ένα πρότυπο του PHP-FIG. Πώς ακριβώς λειτουργεί, εξηγεί η σελίδα Namespaces και autoloading· μια επισκόπηση όλων των προτύπων δίνει η σελίδα Πρότυπα PSR.
<?php
require __DIR__ . '/../vendor/autoload.php';
$log = new Monolog\Logger('app'); // φορτώνεται αυτόματα όταν χρειάζεται
Το Composer στην παραγωγή: σωστή παράδοση
Για την παράδοση έχει καθιερωθεί μια σταθερή σειρά. Εκτελείται καλύτερα σε ένα pipeline build και όχι με το χέρι στον διακομιστή.
- Έλεγχος του αρχείου lock: το
composer validateδιασφαλίζει ότι τοcomposer.jsonείναι έγκυρο και τοcomposer.lockενημερωμένο. - Εγκατάσταση χωρίς πακέτα ανάπτυξης: το
composer install --no-devπαραλείπει τοrequire-dev. - Βελτιστοποίηση του autoloader: το
--optimize-autoloader(συντομογραφία-o) μετατρέπει τους κανόνες σε λίστα κλάσεων. Με το--classmap-authoritativeη PHP φορτώνει κλάσεις αποκλειστικά από αυτή τη λίστα. - Έλεγχος ασφαλείας: το
composer audit --lockedελέγχει τις εκδόσεις από το αρχείο lock απέναντι σε γνωστές αναφορές ασφαλείας και αναφέρει εγκαταλελειμμένα πακέτα. - Vendor εκτός του webroot: μόνο ο δημόσιος φάκελος με το σενάριο εισόδου πρέπει να είναι προσβάσιμος μέσω URL.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev
Το composer outdated δείχνει επιπλέον ποια εγκατεστημένα πακέτα έχουν νεότερες εκδόσεις. Αυτό είναι η βάση για προγραμματισμένες ενημερώσεις αντί για βιαστικές μεμονωμένες ενέργειες.
Composer, ασφάλεια και PHP2Shell
Το Composer και το PHP2Shell αφορούν δύο διαφορετικά επίπεδα. Οι ευπάθειες CVE-2026-109618 και CVE-2026-109619 βρίσκονται στον ίδιο τον διερμηνέα PHP. Έχουν διορθωθεί στις PHP 8.5.12, 8.4.27, 8.3.36 και 8.2.35 και μετά πρέπει να γίνει επανεκκίνηση όλων των διεργασιών PHP. Κανένα composer update και κανένα πακέτο στον vendor δεν αλλάζει κάτι σε αυτό.
Παρ' όλα αυτά, το Composer ανήκει σε κάθε έλεγχο μετά από ένα περιστατικό. Όποιος φέρνει κακόβουλο κώδικα σε έναν διακομιστή, μπορεί να αλλάξει και αρχεία στον vendor, και το vendor/autoload.php φορτώνεται σε κάθε αίτημα. Ένα φρέσκο composer install από το ελεγμένο αρχείο lock σε έναν κενό κατάλογο είναι γι' αυτό μια καλή μέθοδος για την αποκατάσταση του αποθέματος πακέτων. Πώς θα ελέγχετε τακτικά τις εξαρτήσεις για γνωστές ευπάθειες, περιγράφει ο οδηγός composer audit.
Ένα πράσινο composer audit δεν λέει τίποτα για το επίπεδο patch της PHP. Ελέγξτε το περιβάλλον εκτέλεσης PHP ξεχωριστά, για παράδειγμα με την υπηρεσία PHP-Patch μας.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Καταγράφουμε για κάθε εφαρμογή την έκδοση PHP, τα πακέτα Composer και την κατάσταση του lock και διαχωρίζουμε με σαφήνεια τον διερμηνέα από τις βιβλιοθήκες.
- Ελέγχουμε αν ο
vendorκαι το αρχείο lock ταιριάζουν μεταξύ τους και αν υπάρχουν πακέτα ανάπτυξης ή αλλοιωμένα αρχεία στην παραγωγή. - Στήνουμε μια αναπαραγώγιμη παράδοση με
install --no-dev, βελτιστοποιημένο autoloader και audit. - Μετά από ένα περιστατικό αποκαθιστούμε το απόθεμα πακέτων από το ελεγμένο αρχείο lock και τεκμηριώνουμε το αποτέλεσμα.
Συχνές ερωτήσεις
Πρέπει το composer.lock να μπαίνει στο αποθετήριο Git;
Ναι. Η τεκμηρίωση του Composer συνιστά ρητά να γίνεται commit του composer.lock. Μόνο έτσι εγκαθιστούν η ανάπτυξη, το CI και η παραγωγή ακριβώς τις ίδιες εκδόσεις πακέτων.
Ποια η διαφορά ανάμεσα στο composer install και στο composer update;
Το install εγκαθιστά τις εκδόσεις που είναι καταγεγραμμένες στο composer.lock. Το update επιλύει εκ νέου τις εξαρτήσεις, φέρνει κατάλληλες νεότερες εκδόσεις και ξαναγράφει το composer.lock. Στον διακομιστή παραγωγής ανήκει μόνο το install.
Κλείνει μια ενημέρωση του Composer την ευπάθεια του PHP2Shell;
Όχι. Το Composer διαχειρίζεται βιβλιοθήκες της εφαρμογής σας, όχι τον διερμηνέα PHP. Το PHP2Shell κλείνει μόνο με ενημέρωση του περιβάλλοντος εκτέλεσης PHP σε διορθωμένη έκδοση και επανεκκίνηση όλων των διεργασιών PHP.
Πού πρέπει να βρίσκεται ο φάκελος vendor;
Ιδανικά εκτός του δημόσια προσβάσιμου καταλόγου ιστού. Πολλά frameworks τοποθετούν γι' αυτόν τον λόγο στο webroot μόνο έναν φάκελο public, ενώ ο vendor βρίσκεται ένα επίπεδο παραπάνω.