Τρέχουσα κατάσταση: PHP2Shell. Δύο κρίσιμες ευπάθειες της PHP (CVSS 9.2) επιτρέπουν κακόβουλο κώδικα χωρίς σύνδεση. Patches από τις 21/10/2026.Τι πρέπει να γίνει τώρα →

Composer: η διαχείριση πακέτων της PHP

Το Composer κατεβάζει και διαχειρίζεται τις βιβλιοθήκες στις οποίες στηρίζονται τα σύγχρονα έργα PHP. Όποιος κατανοεί τα composer.json, composer.lock και τον autoloader, παραδίδει αναπαραγώγιμα και ασφαλέστερα.

Ημερομηνία 5 λεπτά ανάγνωσηςΓνώση PHP

Εν συντομία: Το 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 και όχι με το χέρι στον διακομιστή.

  1. Έλεγχος του αρχείου lock: το composer validate διασφαλίζει ότι το composer.json είναι έγκυρο και το composer.lock ενημερωμένο.
  2. Εγκατάσταση χωρίς πακέτα ανάπτυξης: το composer install --no-dev παραλείπει το require-dev.
  3. Βελτιστοποίηση του autoloader: το --optimize-autoloader (συντομογραφία -o) μετατρέπει τους κανόνες σε λίστα κλάσεων. Με το --classmap-authoritative η PHP φορτώνει κλάσεις αποκλειστικά από αυτή τη λίστα.
  4. Έλεγχος ασφαλείας: το composer audit --locked ελέγχει τις εκδόσεις από το αρχείο lock απέναντι σε γνωστές αναφορές ασφαλείας και αναφέρει εγκαταλελειμμένα πακέτα.
  5. 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 βρίσκεται ένα επίπεδο παραπάνω.

Πηγές

Άμεση επικοινωνία

Κάθε ώρα μετράει. Γράψτε μας τώρα.

Περιγράψτε σύντομα το σύστημα, την έκδοση PHP και ό,τι παρατηρείτε. Θα επικοινωνήσουμε μαζί σας, θα διευκρινίσουμε την κατάσταση και θα εργαστούμε εξ αποστάσεως μέχρι το περιστατικό να κλείσει και να τεκμηριωθεί.

Άμεση βοήθεια