Εν συντομία: Για την ασφάλεια του php.ini μετρούν κυρίως τέσσερις τομείς: καμία εμφάνιση μηνυμάτων σφάλματος προς τα έξω, ασφαλή cookies session, περιορισμένα uploads και κλειδωμένες τιμές που οι εφαρμογές δεν μπορούν να αντικαταστήσουν. Μετά το PHP2Shell προστίθενται τα προσωρινά μέτρα του php.net, κυρίως το session.upload_progress.enabled=0. Μια ασφαλής διαμόρφωση δεν αντικαθιστά ποτέ την ενημέρωση.
Γιατί το php.ini επανέρχεται στο προσκήνιο μετά το PHP2Shell
Το php.ini είναι το κεντρικό αρχείο διαμόρφωσης της PHP. Σε πολλούς διακομιστές ρυθμίστηκε μία φορά και έπειτα σχεδόν δεν το άγγιξε κανείς. Με το PHP2Shell αυτό άλλαξε: για τις δύο ευπάθειες CVE-2026-109618 και CVE-2026-109619 το php.net αναφέρει προσωρινά μέτρα που εφαρμόζονται ακριβώς εδώ.
Οι ίδιες οι ευπάθειες βρίσκονται στον διερμηνέα PHP. Διορθώθηκαν στις PHP 8.5.12, 8.4.27, 8.3.36 και 8.2.35, που δημοσιεύθηκαν στις 21.10.2026. Μια καλή διαμόρφωση βοηθά παρ' όλα αυτά με δύο τρόπους: μπορεί να δυσκολέψει την εκμετάλλευση και περιορίζει τη ζημιά, αν κάτι καταφέρει τελικά να περάσει.
Πολλοί διαχειριστές δεν γνωρίζουν επιπλέον με ακρίβεια ποιες ρυθμίσεις ισχύουν στον διακομιστή τους. Αυτό είναι το πρώτο βήμα.
Ποιο php.ini ισχύει στον διακομιστή σας;
Η PHP μπορεί, ανάλογα με τον τρόπο λειτουργίας, να διαβάζει διαφορετικά αρχεία διαμόρφωσης. Η γραμμή εντολών, το PHP-FPM και ο Apache με mod_php έχουν π.χ. σε Debian και Ubuntu από έναν δικό τους φάκελο κάτω από το /etc/php/<version>/. Όποιος αλλάζει μόνο το αρχείο του CLI, δεν αλλάζει τίποτα στον ιστότοπο.
# Αρχεία διαμόρφωσης της γραμμής εντολών
php --ini
# Διαμόρφωση του PHP-FPM (προσαρμόστε τον αριθμό έκδοσης)
php-fpm8.3 -i | grep -E "Loaded Configuration|Scan this dir"
# Έλεγχος μεμονωμένων τιμών του PHP-FPM
php-fpm8.3 -i | grep -E "^(expose_php|display_errors|session.upload_progress.enabled) "
Επιπλέον, τιμές μπορούν να βρίσκονται στο pool του FPM, στη διαμόρφωση του Apache, στο .htaccess (μόνο mod_php) ή στο .user.ini (FPM και CGI). Ποια έκδοση εκτελείται πραγματικά στον διακομιστή και αν περιλαμβάνεται backport, ξεκαθαρίζει το άρθρο Σωστός έλεγχος έκδοσης PHP και επιπέδου patch.
Βασικές ρυθμίσεις για περισσότερη ασφάλεια του php.ini
Οι παρακάτω τιμές είναι λογικές για τους περισσότερους διακομιστές παραγωγής. Πριν τις εφαρμόσετε, ελέγξτε σε περιβάλλον δοκιμών αν η εφαρμογή σας λειτουργεί με όλες τις τιμές.
; Καμία αναφορά έκδοσης στην κεφαλίδα HTTP
expose_php = Off
; Καταγραφή σφαλμάτων, αλλά ποτέ εμφάνιση στο πρόγραμμα περιήγησης
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log
; Καμία ενσωμάτωση αρχείων από απομακρυσμένες διευθύνσεις
allow_url_include = Off
; το allow_url_fopen να μένει ενεργό μόνο αν το χρειάζεται η εφαρμογή
allow_url_fopen = Off
; Sessions: αυστηρά, μόνο μέσω HTTPS, μη αναγνώσιμα από JavaScript
session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = Lax
; Περιορισμός χρόνου εκτέλεσης και εισόδων
max_execution_time = 30
max_input_time = 60
max_input_vars = 1000
Το allow_url_fopen το χρειάζονται ορισμένες εφαρμογές για ενημερώσεις ή διεπαφές. Απενεργοποιήστε το μόνο αν το έχετε ελέγξει προηγουμένως. Συναρτήσεις που εκτελούν εντολές συστήματος μπορούν να αποκλειστούν επιπλέον· πώς γίνεται αυτό χωρίς παρενέργειες, εξηγεί ο οδηγός Σωστή χρήση του disable_functions.
Προσωρινά μέτρα του php.net για το PHP2Shell
Αν δεν μπορείτε να ενημερώσετε άμεσα, το php.net αναφέρει διάφορες ρυθμίσεις που μειώνουν τον κίνδυνο. Δεν αποτελούν ρητά πλήρη προστασία, αλλά γέφυρα μέχρι την ενημέρωση.
; Απενεργοποίηση του session upload progress (και λόγω του CVE-2026-115560)
session.upload_progress.enabled = 0
; Περιορισμός του μεγέθους αιτήματος: 8M χωρίς uploads, 32M με uploads
post_max_size = 8M
upload_max_filesize = 6M
; Μόνο PHP 8.5: καμία backtrace σε σοβαρά σφάλματα
fatal_error_backtraces = 0
Επιπλέον το php.net συνιστά να οριστεί memory_limit=-1 έτσι ώστε οι εφαρμογές να μην μπορούν να αντικαταστήσουν την τιμή, και το όριο μνήμης να τίθεται μέσω container ή cgroup και όχι μέσω RLIMIT_AS ή RLIMIT_DATA. Αυτό το μέτρο ανήκει στο pool του FPM ή στη διαμόρφωση του διακομιστή και πρέπει να συνδυάζεται με ένα λειτουργικό όριο cgroup. Την πλήρη επισκόπηση θα βρείτε στη σελίδα Άμεσα μέτρα όταν δεν μπορείτε ακόμη να ενημερώσετε.
Το session.upload_progress.enabled=0 ισχύει μόνο από το php.ini, το pool του FPM ή τη διαμόρφωση του διακομιστή. Αν οριστεί μέσω ini_set() ή .user.ini, το μέτρο δεν έχει αποτέλεσμα. Στη συνέχεια επανεκκινήστε όλους τους workers.
Κλείδωμα τιμών ώστε να μην αντικαθίστανται
Πολλές εφαρμογές ορίζουν δικές τους τιμές, π.χ. για μνήμη ή uploads. Με τα php_admin_value και php_admin_flag ορίζετε ρυθμίσεις έτσι ώστε ούτε το ini_set() ούτε το .user.ini να μπορούν να τις αλλάξουν. Στο pool του FPM μοιάζει έτσι:
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (απόσπασμα)
php_admin_flag[display_errors] = off
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_value[upload_max_filesize] = 6M
php_admin_value[error_log] = /var/log/php/meine-seite.error.log
Στον Apache με mod_php ισχύει η ίδια λογική με τα php_admin_value και php_admin_flag στη διαμόρφωση του VirtualHost. Στη συνέχεια κάντε reload στην υπηρεσία και ελέγξτε αντίστροφα την ενεργή τιμή:
sudo systemctl reload php8.3-fpm
# Χρόνος εκκίνησης των διεργασιών: είναι μετά την αλλαγή;
ps -eo pid,lstart,cmd | grep "[p]hp-fpm"
Ένα reload επανεκκινεί τους workers του PHP-FPM. Μετά από μια ενημέρωση PHP χρειάζεται αντίθετα πλήρης επανεκκίνηση όλων των διεργασιών PHP, ώστε να μην εκτελείται καμία παλιά διεργασία στη μνήμη. Αν έχετε περισσότερους ιστοτόπους σε έναν διακομιστή, αξίζει επιπλέον ένα ξεχωριστό pool ανά ιστότοπο, περισσότερα στον οδηγό open_basedir και απομόνωση ανά ιστότοπο.
Συχνά λάθη και μια σύντομη λίστα ελέγχου
Τα περισσότερα προβλήματα με το php.ini δεν προκύπτουν από λάθος τιμές, αλλά από τιμές σε λάθος σημείο. Τυπικό είναι το αλλαγμένο αρχείο CLI, ενώ ο ιστότοπος εκτελείται μέσω PHP-FPM. Εξίσου συχνά μετά από μια αλλαγή δεν γίνεται επανεκκίνηση, ή ένα πάνελ φιλοξενίας αντικαθιστά τη δική σας ρύθμιση στην επόμενη αποθήκευση.
Ένα δεύτερο κλασικό είναι τα ορατά μηνύματα σφάλματος στον ζωντανό ιστότοπο. Αποκαλύπτουν διαδρομές, ονόματα βάσεων δεδομένων ή εκδόσεις και διευκολύνουν τον προσανατολισμό των επιτιθέμενων. Ιδίως μετά από μετεγκατάσταση ή νέα εγκατάσταση, το display_errors βρίσκεται συχνά πάλι στο On.
Αυτά τα σημεία πρέπει να ελέγχετε μετά από κάθε αλλαγή και μετά από κάθε ενημέρωση PHP:
- Ποιο αρχείο διαμόρφωσης διαβάζει ο τρόπος λειτουργίας για τον ιστό και περιέχει τις τιμές σας;
- Είναι απενεργοποιημένα τα
display_errorsκαιexpose_phpκαι είναι εγγράψιμο το log σφαλμάτων; - Είναι το
session.upload_progress.enabledστο0, ορισμένο μέσω php.ini ή pool; - Είναι περιορισμένα τα μεγέθη uploads και αιτημάτων σε επίπεδο κατάλληλο για την εφαρμογή;
- Εκτελούνται όλες οι διεργασίες PHP με χρόνο εκκίνησης μετά την τελευταία αλλαγή;
Καταγράψτε το αποτέλεσμα με ημερομηνία. Έτσι μπορεί αργότερα να αποδειχθεί πότε ίσχυε ποια ρύθμιση.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Εντοπίζουμε ποια διαμόρφωση είναι πραγματικά ενεργή σε ποιον τρόπο λειτουργίας.
- Εφαρμόζουμε μια συντονισμένη βασική διαμόρφωση και τα προσωρινά μέτρα για το PHP2Shell, δοκιμασμένα με την εφαρμογή σας.
- Κλειδώνουμε τις τιμές που αφορούν την ασφάλεια ώστε να μην αντικαθίστανται και επανεκκινούμε ελεγχόμενα όλους τους workers.
- Τεκμηριώνουμε ρυθμίσεις και αποτέλεσμα ελέγχου, ώστε οι μεταγενέστερες αλλαγές να παραμένουν ανιχνεύσιμες.
Πώς μοιάζει μια μόνιμη θωράκιση, περιγράφει η υπηρεσία Θωράκιση διακομιστών PHP.
Συχνές ερωτήσεις
Ποιο php.ini χρησιμοποιεί στην πραγματικότητα ο διακομιστής ιστού μου;
Συχνά δεν είναι το ίδιο με αυτό της γραμμής εντολών. Το PHP-FPM, ο Apache με mod_php και το CLI έχουν συνήθως δικούς τους φακέλους διαμόρφωσης. Ελέγξτε γι' αυτό το ενεργό αρχείο μέσω του αντίστοιχου τρόπου λειτουργίας, π.χ. με php-fpm -i ή με ένα αρχείο ελέγχου που τοποθετείτε προσωρινά.
Αντικαθιστά ένα ασφαλές php.ini την ενημέρωση της PHP;
Όχι. Οι ρυθμίσεις μειώνουν την επιφάνεια επίθεσης και δυσκολεύουν την εκμετάλλευση, αλλά δεν κλείνουν καμία ευπάθεια στον διερμηνέα PHP. Ούτε τα προσωρινά μέτρα του php.net για το PHP2Shell αποτελούν ρητά πλήρη προστασία.
Ποια η διαφορά μεταξύ php_value και php_admin_value;
Τις τιμές που ορίζονται με php_value μπορεί η εφαρμογή να τις αλλάξει ξανά κατά την εκτέλεση. Οι τιμές μέσω php_admin_value στο pool του FPM ή στη διαμόρφωση του Apache είναι αντίθετα κλειδωμένες για την εφαρμογή, ακόμη και για το ini_set() και το .user.ini.
Πρέπει να κάνω επανεκκίνηση μετά από αλλαγή στο php.ini;
Ναι. Το PHP-FPM και ο Apache με mod_php διαβάζουν τη διαμόρφωση μόνο κατά την εκκίνηση. Οι νέες τιμές ισχύουν μόνο μετά από επανεκκίνηση ή reload όλων των επηρεαζόμενων υπηρεσιών.