Εν συντομία: Για διαχειριστές χωρίς υπόβαθρο ανάπτυξης αρκούν πέντε βασικά στοιχεία ώστε να λειτουργούν την PHP με ασφάλεια: η PHP αποτελείται από περισσότερα προγράμματα (γραμμή εντολών, PHP-FPM, module Apache) με καθένα τη δική του έκδοση· οι ρυθμίσεις ισχύουν σε επίπεδα από το php.ini έως την εφαρμογή· το PHP-FPM μοιράζει τα αιτήματα σε workers μέσα σε pools· μια ενημέρωση γίνεται αποτελεσματική μόνο μετά την επανεκκίνηση όλων των διεργασιών· και τα logs είναι η σημαντικότερη ένδειξη όταν κάτι δεν πάει καλά. Όποιος γνωρίζει αυτά τα σημεία, μπορεί να κλείνει ευπάθειες όπως το PHP2Shell γρήγορα και με αποδείξεις.
Από τι αποτελείται η PHP σε έναν διακομιστή
Η PHP δεν είναι ένα μεμονωμένο πρόγραμμα. Σε έναν τυπικό διακομιστή Linux υπάρχουν πολλές παραλλαγές, καθεμία συνδεδεμένη μέσω μιας διεπαφής διακομιστή (SAPI):
| Παραλλαγή | Τυπικό όνομα | Για ποιον σκοπό |
|---|---|---|
| Γραμμή εντολών (CLI) | php, php8.3 |
Cronjobs, Composer, σενάρια συντήρησης |
| PHP-FPM | php-fpm, php-fpm8.3 |
Αιτήματα ιστού πίσω από Nginx ή Apache |
| Module Apache | mod_php, libphp |
Αιτήματα ιστού απευθείας στη διεργασία του Apache |
| CGI | php-cgi |
παλαιότερες δομές |
Κάθε παραλλαγή μπορεί να έχει διαφορετική έκδοση και διαφορετικό php.ini. Σε πολλούς διακομιστές εκτελούνται επιπλέον πολλές εκδόσεις PHP παράλληλα, για παράδειγμα 8.2 και 8.4. Σε μια ενημέρωση πρέπει να εξετάζεται καθεμία χωριστά. Πώς λειτουργούν οι διεπαφές, εξηγεί η σελίδα Το PHP-FPM εξηγημένο.
Ποια παραλλαγή εξυπηρετεί πράγματι τους ιστότοπούς σας, το διαπιστώνετε από τις διεργασίες που εκτελούνται και τη διαμόρφωση του διακομιστή ιστού:
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php # φορτώνει ο Apache module PHP;
ls /run/php/ 2>/dev/null # sockets FPM, συχνά ανά έκδοση και pool
Η στήλη με την ώρα εκκίνησης είναι αργότερα σημαντική στην επανεκκίνηση: όλες οι διεργασίες PHP πρέπει να έχουν ξεκινήσει μετά τη χρονική στιγμή της ενημέρωσης. Αν οι διεργασίες εκτελούνται υπό διαφορετικούς χρήστες, αυτό υποδηλώνει χωριστά pools, κάτι που είναι καλό. Αν εμφανίζεται ένα module PHP στον Apache, ενώ όλοι οι ιστότοποι πρέπει να εκτελούνται μέσω FPM, αυτό είναι ένδειξη κληρονομιάς του παρελθόντος που πρέπει να αφαιρεθεί. Για περιβάλλοντα hosting όπως το Plesk ή το cPanel ισχύει η ίδια αρχή, με τη διαφορά ότι το περιβάλλον εμφανίζει τις εκδόσεις και τους handlers ανά ιστότοπο· καθοριστικό παραμένει όμως τι εκτελείται πραγματικά ως διεργασία.
Οι σημαντικότερες εντολές για διαχειριστές
php -v # έκδοση της γραμμής εντολών
php --ini # φορτωμένο php.ini και πρόσθετοι κατάλογοι που διαβάζονται
php --ini=diff # από την PHP 8.5: αποκλίσεις από την προεπιλογή
php -m # μεταγλωττισμένα και φορτωμένα modules
php --ri session # ρυθμίσεις μιας επέκτασης
php -l datei.php # έλεγχος σύνταξης χωρίς εκτέλεση
php-fpm8.3 -v # έκδοση του δυαδικού αρχείου FPM (το όνομα εξαρτάται από τη διανομή)
php-fpm8.3 -t # δοκιμή της διαμόρφωσης FPM χωρίς επανεκκίνηση
systemctl status php8.3-fpm
Δύο υποδείξεις από το εγχειρίδιο: το php -l βρίσκει συντακτικά σφάλματα, αλλά όχι σφάλματα που εμφανίζονται μόνο κατά την εκτέλεση. Και το php -i καλεί την phpinfo()· η έξοδος δεν ανήκει σε δημόσια αρχεία στον κατάλογο ιστού.
Πώς ισχύουν οι ρυθμίσεις της PHP
Μια ρύθμιση μπορεί να οριστεί σε πολλά σημεία. Ποιος επιτρέπεται να αλλάζει τι και πού, το ρυθμίζει ο τρόπος αλλαγής κάθε οδηγίας:
- php.ini και conf.d: βασική διαμόρφωση ανά παραλλαγή, διαβάζεται κατά την εκκίνηση.
- Pool FPM:
php_valueκαιphp_admin_valueανά pool. Τις τιμές που ορίζονται μεphp_admin_valueη εφαρμογή δεν μπορεί σύμφωνα με το εγχειρίδιο να τις παρακάμψει μεini_set(). - Επίπεδο καταλόγου:
.user.iniστο FPM ή.htaccessστο mod_php, μόνο για οδηγίες σε λειτουργίαINI_PERDIRήINI_ALL. - Εφαρμογή:
ini_set()κατά την εκτέλεση, μόνο για οδηγίες σε λειτουργίαINI_ALL.
Ένα παράδειγμα: το memory_limit έχει τον τρόπο INI_ALL, μπορεί επομένως να αλλαχτεί από την εφαρμογή. Το post_max_size έχει INI_PERDIR και δεν αλλάζει με ini_set(). Γι' αυτό το php.net απαιτεί στα προσωρινά μέτρα PHP2Shell να ορίζονται οι τιμές έτσι ώστε οι εφαρμογές να μην μπορούν να τις παρακάμψουν. Λεπτομέρειες για τα επίπεδα εξηγεί η σελίδα Το php.ini εξηγημένο.
Pools PHP-FPM εν συντομία
Ένα pool είναι μια ομάδα workers με δικό τους χρήστη, δικό τους socket και δικές τους ρυθμίσεις. Οι σημαντικότερες οδηγίες σύμφωνα με το εγχειρίδιο:
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic ; static, dynamic ή ondemand
pm.max_children = 20 ; το πολύ 20 ταυτόχρονα αιτήματα
pm.max_requests = 500 ; ανανέωση του worker μετά από 500 αιτήματα
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/shop-slow.log
php_admin_value[error_log] = /var/log/php-fpm/shop-error.log
php_admin_flag[log_errors] = on
Ένα ξεχωριστό pool ανά ιστότοπο με δικό του χρήστη διαχωρίζει τους ιστότοπους μεταξύ τους. Το security.limit_extensions είναι από προεπιλογή .php .phar και εμποδίζει το FPM να εκτελεί άλλες καταλήξεις αρχείων εκτός από PHP. Το clear_env είναι από προεπιλογή ενεργό και κρατά τις μεταβλητές περιβάλλοντος μακριά από τον worker.
Logs: πού κοιτάζουν οι διαχειριστές
Η PHP γράφει σφάλματα στον προορισμό που ορίζεται με το error_log, το PHP-FPM επιπλέον στο δικό του log και, για αργά αιτήματα, στο slowlog με backtrace. Προστίθενται τα logs πρόσβασης και σφαλμάτων του διακομιστή ιστού. Προσέξτε ώστε το display_errors να είναι απενεργοποιημένο στην παραγωγή και το log_errors ενεργοποιημένο: τα σφάλματα ανήκουν στο log, όχι στην ιστοσελίδα. Τα logs πρέπει επιπλέον να περιστρέφονται και να φυλάσσονται για καθορισμένο διάστημα, ώστε να υπάρχουν ακόμη σε περίπτωση ανάγκης. Μετά το PHP2Shell ο εξειδικευμένος Τύπος συνιστά να φυλάσσονται τα logs του διακομιστή από τις 20.10.2026. Ένα ισχυρό προειδοποιητικό σημάδι είναι μια διεργασία PHP-FPM ή διακομιστή ιστού που ξεκινά ένα shell· πώς το αναγνωρίζετε, αναφέρεται στη σελίδα Προειδοποιητικό σήμα: ο διακομιστής ιστού ξεκινά ένα shell.
Λίστα ελέγχου για διαχειριστές μετά το PHP2Shell
- Καταγραφή όλων των παραλλαγών και εκδόσεων PHP στον διακομιστή, ακόμη και των μη χρησιμοποιούμενων.
- Έλεγχος του επιπέδου πακέτου· στα backports της διανομής, αναζήτηση στο changelog για CVE-2026-109618 και CVE-2026-109619.
- Ενημέρωση στην 8.5.12, 8.4.27, 8.3.36 ή 8.2.35 ή στο επιβεβαιωμένο backport.
- Επανεκκίνηση των PHP-FPM, Apache και LiteSpeed και έλεγχος των χρόνων εκκίνησης των διεργασιών.
- Αντιπαραβολή με
php -r 'var_dump(ini_get("memory_hard_limit_percent"));'· τοbool(false)σημαίνει σύμφωνα με το εγχειρίδιο επηρεαζόμενη έκδοση. - Διασφάλιση των logs και έλεγχος για ανωμαλίες.
Πώς αποδεικνύετε με αξιοπιστία την έκδοση και το επίπεδο ενημέρωσης, περιγράφει η σελίδα Σωστός έλεγχος έκδοσης PHP και επιπέδου ενημέρωσης.
Πώς βοηθά συγκεκριμένα η PHP SOS;
Στη σύμβαση συντήρησης ασφαλείας αναλαμβάνουμε τη βασική φροντίδα της PHP μαζί με την ομάδα σας:
- Ευρετήριο: όλες οι παραλλαγές PHP, εκδόσεις, pools και θέσεις διαμόρφωσης ανά διακομιστή.
- Διαμόρφωση: τιμές σχετικές με την ασφάλεια ορισμένες με
php_admin_value, pools ανά ιστότοπο χωρισμένα. - Ενημερώσεις: εγκατάσταση, επανεκκίνηση, έλεγχος και τεκμηρίωση σε κάθε έκδοση ασφαλείας.
- Μεταφορά γνώσης: Εξηγούμε στους διαχειριστές σας τι αλλάξαμε και γιατί.
Συχνές ερωτήσεις
Γιατί το php -v δείχνει άλλη έκδοση από τον ιστότοπο;
Η γραμμή εντολών, το PHP-FPM και το module Apache είναι ξεχωριστά προγράμματα με δική τους έκδοση και δικό τους php.ini. Το php -v δείχνει μόνο τη γραμμή εντολών. Για τον ιστότοπο μετρά η έκδοση του δυαδικού αρχείου που πράγματι επεξεργάζεται αιτήματα.
Ποιο php.ini ισχύει στον διακομιστή μου;
Αυτό το δείχνει το php --ini για τη γραμμή εντολών. Για το PHP-FPM υπάρχει συνήθως ξεχωριστό php.ini και πρόσθετα αρχεία pool. Από την PHP 8.5 το php --ini=diff δείχνει ποιες τιμές αποκλίνουν από την προεπιλογή.
Ποια είναι η διαφορά μεταξύ php_value και php_admin_value;
Και τα δύο ορίζουν ρυθμίσεις σε ένα pool FPM. Τις τιμές με php_admin_value η εφαρμογή δεν μπορεί σύμφωνα με το εγχειρίδιο να τις παρακάμψει με ini_set(). Για ρυθμίσεις σχετικές με την ασφάλεια το php_admin_value είναι επομένως η σωστή επιλογή.
Αρκεί μια ενημέρωση χωρίς επανεκκίνηση;
Όχι. Οι διεργασίες PHP που εκτελούνται κρατούν τον παλιό κώδικα στη μνήμη. Μετά από μια ενημέρωση πρέπει να επανεκκινηθούν το PHP-FPM, ο Apache με mod_php ή το LiteSpeed, διαφορετικά εξακολουθεί να εκτελείται η ευάλωτη έκδοση.