Εν συντομία: Το SAPI σημαίνει Server Application Programming Interface, τη διεπαφή μέσω της οποίας η PHP μιλά με το περιβάλλον της. Τυπικά SAPI είναι τα fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed και cli για τη γραμμή εντολών. Το SAPI καθορίζει πώς φτάνουν τα αιτήματα, ποιο php.ini ισχύει και ποιες διεργασίες πρέπει να επανεκκινηθούν μετά από μια ενημέρωση. Στο PHP2Shell από αυτό εξαρτάται ακόμη και η κατάταξη του κινδύνου.
Τι είναι ένα SAPI;
Η ίδια η PHP είναι ένα πρόγραμμα που εκτελεί κώδικα. Για να παραδίδει ιστοσελίδες, χρειάζεται σύνδεση με έναν διακομιστή ιστού, με τη γραμμή εντολών ή με κάποια άλλη εφαρμογή. Αυτή η σύνδεση είναι το SAPI. Δέχεται τα δεδομένα του αιτήματος, τα προωθεί στη Zend Engine και επιστρέφει την έξοδο.
Μπορεί κανείς να φανταστεί το SAPI σαν φις: ο κινητήρας παραμένει ο ίδιος, ανάλογα όμως με το φις προσαρμόζεται στον Apache, στον Nginx μέσω FastCGI, στο LiteSpeed ή στο τερματικό. Κάθε παραλλαγή έχει δικά της πλεονεκτήματα, δικούς της τρόπους διαμόρφωσης και δικές της παγίδες.
Το SAPI αποφασίζει κυρίως για τρία πράγματα που μετρούν στην καθημερινότητα:
- Μοντέλο διεργασιών: Εκτελείται η PHP μέσα στον διακομιστή ιστού, ως ξεχωριστή υπηρεσία με μόνιμους workers ή ως βραχύβια διεργασία ανά κλήση;
- Διαμόρφωση: Ποιο php.ini διαβάζεται και πού επιτρέπεται να βρίσκονται πρόσθετες ρυθμίσεις, για παράδειγμα στο
.htaccess, σε ένα.user.iniή στο pool του FPM; - Δικαιώματα και διαχωρισμός: Με ποιον χρήστη εκτελείται ο κώδικας και μπορούν να διαχωριστούν πολλοί ιστότοποι μεταξύ τους;
Στα πάνελ φιλοξενίας τα SAPI εμφανίζονται με άλλα ονόματα. Το Plesk μιλά για παράδειγμα για χειριστές PHP όπως «FPM application», «FastCGI application» ή «Apache module». Εννοούνται οι ίδιοι τρόποι λειτουργίας που περιγράφει αυτή η σελίδα. Σε περίπτωση αμφιβολίας βοηθά το αρχείο ελέγχου παρακάτω, που δείχνει το πραγματικό όνομα του SAPI.
Ποια SAPI της PHP υπάρχουν;
Το εγχειρίδιο της PHP αναφέρει για το php_sapi_name(), μεταξύ άλλων, αυτές τις τιμές επιστροφής: apache, apache2handler, cgi (έως την PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed και phpdbg. Η λίστα δεν είναι ρητά εξαντλητική.
| Όνομα SAPI | Τρόπος λειτουργίας | Τυπική χρήση | Μοντέλο διεργασιών |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache με proxy_fcgi, πάνελ φιλοξενίας |
ξεχωριστή υπηρεσία με pools workers |
apache2handler |
mod_php | παλαιότεροι διακομιστές Apache, απλά images Docker | PHP μέσα στη διεργασία του Apache |
cgi-fcgi |
php-cgi | παλιές εγκαταστάσεις, ορισμένες διαμορφώσεις Windows | διεργασία ανά αίτημα ή FastCGI |
litespeed |
LSAPI | διακομιστής LiteSpeed, πολλοί πάροχοι κοινόχρηστης φιλοξενίας | δικές του διεργασίες PHP |
cli |
γραμμή εντολών | cronjobs, Composer, σενάρια συντήρησης | μία διεργασία ανά κλήση |
cli-server |
ενσωματωμένος διακομιστής ιστού | μόνο τοπική ανάπτυξη (php -S) |
ένας διακομιστής ανάπτυξης |
embed |
ενσωματωμένο | PHP μέσα σε άλλα προγράμματα | ανάλογα με το πρόγραμμα |
phpdbg |
εργαλείο εντοπισμού σφαλμάτων | αναζήτηση σφαλμάτων | διαδραστικό |
Το FrankenPHP είναι ένας σύγχρονος διακομιστής εφαρμογών που ενσωματώνει απευθείας την PHP. Επηρεάζεται επίσης από το PHP2Shell και έχει δικούς του δρόμους ενημέρωσης· λεπτομέρειες στη σελίδα Θωράκιση του FrankenPHP.
Έτσι ελέγχετε το SAPI του διακομιστή σας
Το SAPI ενός ιστότοπου το μαθαίνετε μόνο μέσω του διακομιστή ιστού, όχι μέσω της γραμμής εντολών. Αρκεί ένα μικρό αρχείο ελέγχου:
<?php
// sapi-check.php: διαγράψτε το αμέσως μετά την κλήση
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
Στη γραμμή εντολών μπορούν να καταγραφούν, μόνο με ανάγνωση, οι εγκατεστημένες παραλλαγές και υπηρεσίες:
php -r 'echo PHP_SAPI, PHP_EOL;' # πάντα "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # εγκατεστημένες εκδόσεις FPM
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # φορτωμένο mod_php;
Γιατί κάθε SAPI μπορεί να έχει δικό του php.ini
Σύμφωνα με το εγχειρίδιο της PHP, η PHP αναζητά πρώτα ένα αρχείο php-SAPI.ini, δηλαδή για παράδειγμα php-cli.ini, και μόνο μετά το php.ini. Διανομές όπως το Debian και το Ubuntu προχωρούν παραπέρα και δημιουργούν ξεχωριστούς φακέλους ανά SAPI, για παράδειγμα /etc/php/8.3/fpm/ και /etc/php/8.3/cli/.
Διαφέρει και η χρονική στιγμή: στις μονάδες διακομιστή η PHP διαβάζει τη διαμόρφωση σύμφωνα με το εγχειρίδιο μόνο μία φορά κατά την εκκίνηση του διακομιστή ιστού, στο CGI και στο CLI σε κάθε κλήση. Όποιος αλλάζει μια ρύθμιση πρέπει γι' αυτό να γνωρίζει ποιο SAPI επηρεάζεται. Περισσότερα στη σελίδα Το php.ini εξηγημένο.
SAPI και ασφάλεια: τι έδειξε το PHP2Shell
Σύμφωνα με τις αναφορές, το PHP2Shell επηρεάζει PHP-FPM, Apache με mod_php, php-cgi, FrankenPHP και LiteSpeed. Η ομάδα της PHP κατατάσσει τον κίνδυνο στο mod_php ως τον υψηλότερο, επειδή εκεί επιδείχθηκε exploit προτού εκτελεστεί κώδικας εφαρμογής. Οι λόγοι βρίσκονται στη σελίδα Γιατί το mod_php φέρει τον υψηλότερο κίνδυνο.
Για τη λειτουργία το SAPI σημαίνει κυρίως ένα πράγμα: καθορίζει τι πρέπει να επανεκκινηθεί μετά την ενημέρωση.
- PHP-FPM: όλα τα pools και οι workers κάθε εγκατεστημένης έκδοσης
- mod_php: ολόκληρη η υπηρεσία του Apache, όχι μόνο ένα reload
- php-cgi και διαμορφώσεις FastCGI: όλες οι εναπομείνασες διεργασίες PHP
- LiteSpeed: οι διεργασίες PHP του διακομιστή ιστού σύμφωνα με τις οδηγίες του κατασκευαστή
- CLI: δεν υπάρχουν μόνιμες διεργασίες, ενημερώστε όμως και το πακέτο, ώστε οι έλεγχοι να είναι σωστοί
Μεσοπρόθεσμα αξίζει η μετάβαση από το mod_php. Το εγχειρίδιο της PHP συνιστά για νέες εγκαταστάσεις Apache το PHP-FPM με mod_proxy_fcgi. Τα βασικά περιγράφει η σελίδα Το PHP-FPM εξηγημένο.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Καταγραφή των SAPI: Εντοπίζουμε για κάθε διακομιστή ποιοι τρόποι λειτουργίας και ποιες εκδόσεις PHP είναι πράγματι ενεργοί.
- Σωστή επανεκκίνηση: Μέσω της υπηρεσίας PHP-Patch ενημερώνουμε κάθε SAPI και τεκμηριώνουμε την επανεκκίνηση όλων των διεργασιών.
- Αντιστοίχιση διαμόρφωσης: Δείχνουμε ποιο php.ini και ποιες ρυθμίσεις pool ισχύουν για τον ιστότοπό σας.
- Σχεδιασμός μετάβασης: Όπου εκτελείται mod_php ή php-cgi, σχεδιάζουμε και δοκιμάζουμε τη μετάβαση στο PHP-FPM.
Συχνές ερωτήσεις
Πώς μαθαίνω ποιο SAPI χρησιμοποιεί ο ιστότοπός μου;
Με τη μεγαλύτερη αξιοπιστία με ένα αρχείο ελέγχου που τοποθετείται για λίγο και εμφανίζει το PHP_SAPI ή το php_sapi_name(), καλούμενο μέσω του διακομιστή ιστού. Στη γραμμή εντολών λαμβάνετε πάντα cli, κάτι που δεν λέει τίποτα για τον ιστότοπο. Στη συνέχεια διαγράψτε αμέσως το αρχείο ελέγχου.
Ποιο SAPI είναι το ασφαλέστερο;
Κανένα δεν είναι από μόνο του ασφαλές. Το PHP-FPM προσφέρει όμως τα περισσότερα εργαλεία διαχωρισμού: ξεχωριστά pools, χρήστες και κλειδωμένες ρυθμίσεις ανά ιστότοπο. Το εγχειρίδιο της PHP συνιστά ρητά για νέες εγκαταστάσεις Apache το PHP-FPM αντί για mod_php.
Επηρεάζεται από το PHP2Shell η έκδοση της γραμμής εντολών της PHP;
Οι γνωστές αναφορές κατονομάζουν PHP-FPM, mod_php, php-cgi, FrankenPHP και LiteSpeed. Το CLI δεν επεξεργάζεται αιτήματα από το δίκτυο. Προέρχεται όμως συνήθως από την ίδια πηγή πακέτων και πρέπει πάντα να ενημερώνεται μαζί, έστω και για να δείχνουν οι εντολές ελέγχου τη σωστή κατάσταση.
Μπορεί ένας διακομιστής να χρησιμοποιεί ταυτόχρονα πολλά SAPI;
Ναι, μάλιστα είναι συνηθισμένο. Σχεδόν κάθε διακομιστής έχει, εκτός από το SAPI ιστού, και το CLI για cronjobs και συντήρηση. Συχνά εκτελούνται επιπλέον παράλληλα πολλές εκδόσεις PHP-FPM. Καθεμία από αυτές πρέπει να ενημερωθεί και να επανεκκινηθεί ξεχωριστά.