Εν συντομία: Το HTTP δεν θυμάται τίποτα ανάμεσα σε δύο αιτήματα. Μια συνεδρία PHP το λύνει αυτό: η PHP αναθέτει ένα τυχαίο αναγνωριστικό συνεδρίας, το στέλνει ως cookie στον browser και αποθηκεύει τα σχετικά δεδομένα στον διακομιστή, από προεπιλογή ως αρχείο. Σε κάθε επόμενο αίτημα το session_start() διαβάζει ξανά τα δεδομένα βάσει του αναγνωριστικού. Στη συνεδρία PHP ανήκει και η λειτουργία session.upload_progress, την οποία το php.net συνιστά λόγω του PHP2Shell να απενεργοποιηθεί προσωρινά από την πλευρά του διακομιστή.
Γιατί οι εφαρμογές ιστού χρειάζονται συνεδρίες
Κάθε αίτημα προς έναν διακομιστή ιστού είναι αυτόνομο. Χωρίς πρόσθετο μηχανισμό, ένα e-shop δεν θα ήξερε πλέον στο κλικ στο «Καλάθι» ποιος έβαλε μόλις κάτι μέσα και μια περιοχή διαχείρισης θα έπρεπε να ζητά τον κωδικό πρόσβασης σε κάθε κλικ. Οι συνεδρίες συνδέουν τα μεμονωμένα αιτήματα σε μία συνεδρία.
Για όσους αποφασίζουν αυτό σημαίνει: το αναγνωριστικό συνεδρίας αξίζει μετά τη σύνδεση όσο το όνομα χρήστη και ο κωδικός πρόσβασης μαζί. Για τους διαχειριστές αυτό σημαίνει: πού και πώς βρίσκονται τα δεδομένα συνεδρίας είναι ζήτημα ασφαλείας, ιδίως σε διακομιστές με πολλούς ιστότοπους.
Τι συμβαίνει στο session_start()
Η διαδικασία είναι ίδια σε κάθε αίτημα και μπορεί να περιγραφεί σε πέντε βήματα:
- Ο browser στέλνει μαζί το cookie με το όνομα της συνεδρίας, από προεπιλογή
PHPSESSID. - Το
session_start()διαβάζει το αναγνωριστικό και το παραδίδει στον handler αποθήκευσης, από προεπιλογήfiles. - Ο handler φορτώνει τα αποθηκευμένα δεδομένα, η PHP τα μετατρέπει πίσω με το
serialize_handlerκαι γεμίζει το$_SESSION. - Το σενάριο διαβάζει και αλλάζει το
$_SESSIONόπως έναν κανονικό πίνακα. - Στο τέλος του αιτήματος η PHP γράφει τα δεδομένα πίσω. Με το
session.lazy_write(προεπιλογή: ενεργό) μόνο όταν έχουν αλλάξει.
<?php
session_start();
$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
Αν δεν υπάρχει ακόμη συνεδρία, η PHP δημιουργεί ένα νέο αναγνωριστικό και ορίζει το cookie. Αν το session.use_strict_mode είναι ενεργό, η PHP απορρίπτει άγνωστα αναγνωριστικά που προέρχονται από τον browser και δημιουργεί νέο. Το εγχειρίδιο της PHP χαρακτηρίζει αυτή τη ρύθμιση ως υποχρεωτική για τη βασική ασφάλεια.
Προεπιλογές που πρέπει να γνωρίζετε
Οι παρακάτω τιμές ισχύουν σύμφωνα με το εγχειρίδιο της PHP, όταν δεν έχει διαμορφωθεί κάτι άλλο. Πολλές διανομές και πάροχοι ορίζουν δικές τους τιμές, γι' αυτό μετρά πάντα η πράγματι ισχύουσα διαμόρφωση.
| Ρύθμιση | Προεπιλογή | Σημασία |
|---|---|---|
session.save_handler |
files |
τόπος αποθήκευσης δεδομένων, δυνατά και Redis ή βάση δεδομένων |
session.name |
PHPSESSID |
όνομα του cookie |
session.serialize_handler |
php |
μορφή των αποθηκευμένων δεδομένων |
session.use_strict_mode |
0 |
τα άγνωστα αναγνωριστικά γίνονται δεκτά |
session.use_only_cookies |
1 |
κανένα αναγνωριστικό συνεδρίας στη διεύθυνση |
session.cookie_httponly |
0 |
η JavaScript μπορεί να διαβάσει το cookie |
session.cookie_secure |
0 |
cookie και μέσω μη κρυπτογραφημένου HTTP |
session.cookie_samesite |
κενό | κανένα χαρακτηριστικό SameSite |
session.gc_maxlifetime |
1440 |
δευτερόλεπτα έως τον πιθανό καθαρισμό |
session.gc_probability / gc_divisor |
1 / 100 |
καθαρισμός περίπου σε κάθε εκατοστή εκκίνηση |
session.upload_progress.enabled |
1 |
η πρόοδος μεταφόρτωσης γράφεται στη συνεδρία |
Οι τιμές για τα cookie_httponly, cookie_secure και use_strict_mode δεν είναι λοιπόν από το εργοστάσιο προσανατολισμένες στην ασφάλεια. Πώς θα τις ορίσετε σωστά, περιγράφει ο οδηγός Θωράκιση των συνεδριών στην PHP. Οι ρυθμίσεις session.sid_length και session.sid_bits_per_character έχουν επισημανθεί ως παρωχημένες από την PHP 8.4.0.
Άμεσος ορισμός cookies
Εκτός από το cookie συνεδρίας, μια εφαρμογή μπορεί να ορίσει δικά της cookies. Από την PHP 7.3.0 το setcookie() δέχεται γι' αυτό έναν πίνακα με επιλογές, συμπεριλαμβανομένου του samesite. Από την PHP 8.5.0 υπάρχει επιπλέον η επιλογή partitioned.
<?php
setcookie('sprache', 'de', [
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
Σύμφωνα με το εγχειρίδιο, στο samesite ίσο με None πρέπει να οριστεί και το secure, διαφορετικά ο browser μπλοκάρει το cookie. Τα cookies είναι δεδομένα του browser: το περιεχόμενό τους επιστρέφει στο επόμενο αίτημα μέσω του $_COOKIE και πρέπει να ελέγχεται όπως κάθε άλλη εισαγωγή. Περισσότερα στη σελίδα Superglobals.
session.upload_progress: ένδειξη προόδου για μεταφορτώσεις
Η PHP μπορεί να γράφει κατά τη μεταφόρτωση ενός αρχείου την πρόοδο στη συνεδρία. Γι' αυτό η φόρμα στέλνει ένα κρυφό πεδίο με το όνομα από το session.upload_progress.name, από προεπιλογή PHP_SESSION_UPLOAD_PROGRESS. Η PHP αποθηκεύει τότε τα δεδομένα κάτω από ένα κλειδί με πρόθεμα upload_progress_ στο $_SESSION, με στοιχεία όπως ώρα έναρξης, συνολικό μέγεθος και ήδη επεξεργασμένα bytes.
Σημαντικό για την κατανόηση: σύμφωνα με το εγχειρίδιο, η PHP γράφει αυτές τις πληροφορίες στη συνεδρία προτού εκτελεστεί οποιοδήποτε σενάριο. Η λειτουργία εργάζεται λοιπόν κατά την επεξεργασία του αιτήματος, πριν από τον κώδικα της εφαρμογής. Οι ρυθμίσεις της είναι τύπου INI_PERDIR και δεν μπορούν να αλλάξουν κατά την εκτέλεση.
Συνεδρίες και PHP2Shell: το προσωρινό μέτρο
Ως ένα από τα προσωρινά μέτρα κατά των ευπαθειών του PHP2Shell το php.net αναφέρει τον ορισμό του session.upload_progress.enabled=0 στο php.ini, στο pool του FPM ή στη διαμόρφωση του διακομιστή και στη συνέχεια την επανεκκίνηση όλων των workers, ρητά όχι μέσω ini_set() ή .user.ini. Στις 23.10.2026 προστέθηκε η υπόδειξη για το CVE-2026-115560, με την ίδια αντιμετώπιση έως την επόμενη τακτική έκδοση διόρθωσης σφαλμάτων.
; Pool FPM του ιστότοπου, στη συνέχεια επανεκκίνηση όλων των workers
php_admin_flag[session.upload_progress.enabled] = off
Σύμφωνα με αναφορές ειδικών, αυτή η ρύθμιση από μόνη της δεν κλείνει και τις δύο ευπάθειες. Υποχρεωτική παραμένει η ενημέρωση στις PHP 8.5.12, 8.4.27, 8.3.36 ή 8.2.35. Το αν η εφαρμογή σας χρησιμοποιεί καθόλου την πρόοδο μεταφόρτωσης και πώς θα ορίσετε τη ρύθμιση μόνιμα, περιγράφει η σελίδα Απενεργοποίηση του session.upload_progress.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Διαβάζουμε τις πράγματι ισχύουσες ρυθμίσεις συνεδριών ανά ιστότοπο, όχι μόνο τις τιμές της γραμμής εντολών.
- Ορίζουμε τα προσωρινά μέτρα για το PHP2Shell ανά pool, επανεκκινούμε όλους τους workers και ελέγχουμε το αποτέλεσμα.
- Διαχωρίζουμε τους τόπους αποθήκευσης συνεδριών και τους χρήστες pool μεταξύ ιστοτόπων στο πλαίσιο της θωράκισης διακομιστή.
- Μετά από ένα περιστατικό ακυρώνουμε όλες τις υπάρχουσες συνεδρίες, ώστε τα κλεμμένα αναγνωριστικά συνεδρίας να καταστούν άχρηστα.
Συχνές ερωτήσεις
Ποια η διαφορά ανάμεσα σε cookie και συνεδρία;
Ένα cookie είναι ένα μικρό σύνολο δεδομένων που αποθηκεύει ο browser και στέλνει σε κάθε αίτημα. Μια συνεδρία αποθηκεύει τα πραγματικά δεδομένα στον διακομιστή· στο cookie βρίσκεται μόνο ένα τυχαίο αναγνωριστικό, το αναγνωριστικό συνεδρίας (session ID).
Πόσο ζει μια συνεδρία PHP;
Το cookie συνεδρίας ισχύει από προεπιλογή μέχρι να κλείσει ο browser. Τα δεδομένα στον διακομιστή επιτρέπεται να καθαριστούν μετά το session.gc_maxlifetime, από προεπιλογή 1440 δευτερόλεπτα χωρίς πρόσβαση. Το πότε συμβαίνει πράγματι, εξαρτάται από τη λογική καθαρισμού του συστήματος.
Τι κάνει το session.upload_progress;
Η λειτουργία γράφει κατά τη μεταφόρτωση ενός αρχείου την πρόοδο στη συνεδρία, ώστε ένα δεύτερο αίτημα να μπορεί να την εμφανίσει. Είναι από προεπιλογή ενεργή. Λόγω του PHP2Shell το php.net συνιστά να απενεργοποιηθεί προσωρινά από την πλευρά του διακομιστή.
Αρκεί η απενεργοποίηση του session.upload_progress με ini_set();
Όχι. Η ρύθμιση δεν μπορεί σύμφωνα με το εγχειρίδιο να αλλάξει κατά την εκτέλεση και το php.net αναφέρει ρητά ως σωστά σημεία το php.ini, το pool του FPM ή τη διαμόρφωση του διακομιστή, όχι το ini_set() ή το .user.ini. Στη συνέχεια επανεκκινήστε όλους τους workers.