Εν συντομία: Τα superglobals είναι προκαθορισμένοι πίνακες, που η PHP γεμίζει αυτόματα σε κάθε αίτημα και που είναι διαθέσιμοι παντού στον κώδικα. Το $_GET περιέχει τις παραμέτρους από τη διεύθυνση, το $_POST τα δεδομένα φορμών, το $_FILES τα αρχεία που μεταφορτώθηκαν, το $_COOKIE τα cookies και το $_SERVER στοιχεία για το αίτημα και τον διακομιστή. Η PHP δημιουργεί αυτούς τους πίνακες προτού ξεκινήσει ο κώδικας της εφαρμογής σας. Γι' αυτό ευπάθειες ακριβώς σε αυτή την επεξεργασία, όπως στο PHP2Shell, δεν μπορούν να αναχαιτιστούν με ελέγχους στην εφαρμογή.
Τι είναι τα superglobals;
Στην PHP μια μεταβλητή ισχύει κανονικά μόνο στη συνάρτηση όπου δημιουργήθηκε. Τα superglobals είναι η εξαίρεση: είναι διαθέσιμα σε κάθε πεδίο ισχύος, χωρίς να χρειάζεται να τα φέρνετε με global. Το εγχειρίδιο της PHP αναφέρει εννέα από αυτά.
Για μη τεχνικούς μπορεί να περιγραφεί έτσι: τα superglobals είναι το γραμματοκιβώτιο της εφαρμογής. Ό,τι στέλνει ένας επισκέπτης, καταλήγει εκεί προτού το διαβάσει η εφαρμογή. Και ό,τι βρίσκεται στο γραμματοκιβώτιο προέρχεται δυνητικά από έναν άγνωστο.
Τα superglobals με μια ματιά
| Superglobal | Περιεχόμενο | Προέλευση |
|---|---|---|
$_GET |
παράμετροι από τη διεύθυνση (query string) | πελάτης |
$_POST |
πεδία φόρμας ενός αιτήματος POST | πελάτης |
$_FILES |
στοιχεία για αρχεία που μεταφορτώθηκαν | πελάτης, επεξεργασμένα από την PHP |
$_COOKIE |
cookies που στέλνει ο browser | πελάτης |
$_REQUEST |
μείγμα από GET, POST και ενδεχομένως cookies | πελάτης |
$_SERVER |
κεφαλίδες αιτήματος, μέθοδος, διαδρομές, στοιχεία διακομιστή | διακομιστής ιστού και πελάτης αναμεμειγμένα |
$_ENV |
μεταβλητές περιβάλλοντος | διακομιστής |
$_SESSION |
δεδομένα της τρέχουσας συνεδρίας | αποθήκευση διακομιστή |
$GLOBALS |
όλες οι καθολικές μεταβλητές | σενάριο |
Ιδιαίτερα ύπουλο είναι το $_SERVER. Σύμφωνα με το εγχειρίδιο, η PHP δημιουργεί για κάθε κεφαλίδα αιτήματος μια εγγραφή με HTTP_ στην αρχή, για παράδειγμα HTTP_USER_AGENT. Αυτές τις τιμές τις ορίζει ο ίδιος ο πελάτης. Και το SERVER_NAME μπορεί σύμφωνα με το εγχειρίδιο να περιέχει το όνομα host που παρέχει ο πελάτης και δεν είναι αξιόπιστο για αποφάσεις ασφαλείας.
Πώς γεμίζει η PHP τα superglobals
Προτού εκτελεστεί ο πρώτος χαρακτήρας του σεναρίου σας, η PHP έχει ήδη εργαστεί. Διαβάζει τη διεύθυνση, τις κεφαλίδες και το περιεχόμενο του αιτήματος, τα αναλύει και τοποθετεί τα αποτελέσματα στους πίνακες. Αυτό το βήμα ελέγχουν πολλές ρυθμίσεις:
variables_order(προεπιλογήEGPCS) καθορίζει ποια superglobals δημιουργούνται καθόλου: Environment, GET, POST, Cookie, Server.request_order(προεπιλογή κενό) καθορίζει από τι σχηματίζεται το$_REQUEST. Αν είναι κενό, ισχύει τοvariables_order. Τα αρχεία php.ini που συνοδεύουν την PHP παραλείπουν σύμφωνα με το εγχειρίδιο τα cookies για λόγους ασφαλείας.max_input_vars(προεπιλογή1000) καιmax_input_nesting_level(προεπιλογή64) περιορίζουν τον αριθμό και την ένθεση των μεταβλητών εισόδου.post_max_size(προεπιλογή8M) περιορίζει το περιεχόμενο του αιτήματος. Αν ένα αίτημα είναι μεγαλύτερο, τα$_POSTκαι$_FILESπαραμένουν κενά.enable_post_data_reading(προεπιλογή ενεργό) ελέγχει αν η PHP αξιολογεί καθόλου αυτόματα το περιεχόμενο των αιτημάτων POST.
Αν το enable_post_data_reading είναι απενεργοποιημένο, η εφαρμογή διαβάζει η ίδια το ακατέργαστο περιεχόμενο μέσω του php://input. Από την PHP 8.4.0 υπάρχει επιπλέον το request_parse_body(), που αξιολογεί δεδομένα φορμών και μεταφορτώσεων και για άλλες μεθόδους εκτός του POST και επιτρέπει δικά του όρια. Πώς εξελίσσεται λεπτομερώς το τμήμα των μεταφορτώσεων, εξηγεί η σελίδα Πώς επεξεργάζεται η PHP τις μεταφορτώσεις αρχείων.
Ασφαλής χειρισμός των δεδομένων αιτημάτων
Η αρχή είναι απλή: κάθε τιμή από τα $_GET, $_POST, $_COOKIE, $_FILES και από τις εγγραφές HTTP_ του $_SERVER είναι ξένη εισαγωγή. Ελέγχεται κατά την αποδοχή και διαφεύγεται κατάλληλα κατά την έξοδο.
<?php
declare(strict_types=1);
// Αναμένεται ακέραιος: έλεγχος αντί για τυφλή μετατροπή
$seite = filter_var($_GET['seite'] ?? '1', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 500],
]);
if ($seite === false) {
http_response_code(400);
exit('Ungültige Seitenzahl');
}
// Να επιτρέπονται μόνο επιτρεπόμενες τιμές
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
? $_GET['sort']
: 'datum';
// Η έξοδος διαφεύγει πάντα
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');
Ένα συχνό εμπόδιο είναι τα στοιχεία για την προέλευση ενός αιτήματος. Αν μπροστά από τον διακομιστή ιστού βρίσκεται ένας reverse proxy, ένας load balancer ή ένα CDN, το $_SERVER['REMOTE_ADDR'] περιέχει τη διεύθυνση αυτού του ενδιάμεσου, όχι του επισκέπτη. Η πραγματική διεύθυνση βρίσκεται τότε σε μια κεφαλίδα όπως η X-Forwarded-For, την οποία όμως μπορεί να ορίσει ο καθένας πελάτης μόνος του. Η εφαρμογή επιτρέπεται να αξιολογεί τέτοιες κεφαλίδες μόνο όταν το αίτημα προέρχεται αποδεδειγμένα από δικό της, γνωστό proxy. Διαφορετικά οι αποκλεισμοί βάσει διεύθυνσης IP ή τα πρωτόκολλα εξαπατώνται εύκολα. Παρόμοια ισχύουν για το HTTPS: αν η κρυπτογράφηση τερματίζεται στο proxy, η εφαρμογή πρέπει να γνωρίζει ρητά ότι η αρχική σύνδεση ήταν κρυπτογραφημένη.
Περαιτέρω πρότυπα για επικύρωση και φιλτράρισμα δείχνει το άρθρο Επικύρωση και φιλτράρισμα εισαγωγών στην PHP. Για δεδομένα συνεδρίας στο $_SESSION ισχύουν δικοί τους κανόνες· βρίσκονται στη σελίδα Συνεδρίες και cookies στην PHP.
Superglobals και PHP2Shell: τι συμβαίνει πριν από τον κώδικά σας
Εδώ βρίσκεται η σύνδεση με την τρέχουσα κατάσταση. Το CVE-2026-109618 περιγράφει ότι μια κατάσταση Out-of-Memory μπορεί να διακόψει την PHP ενώ τα δεδομένα του αιτήματος έχουν αρχικοποιηθεί μόνο εν μέρει· κατά τον καθαρισμό του αιτήματος, μη έγκυρα δεδομένα μπορεί τότε να αντιμετωπιστούν ως έγκυρα. Στο CVE-2026-109619 η εσωτερική κατάσταση ενός αιτήματος μπορεί να παραμείνει μετά την απελευθέρωση της μνήμης και να χρησιμοποιηθεί από ένα μεταγενέστερο αίτημα στον ίδιο worker.
Και οι δύο ευπάθειες βρίσκονται λοιπόν στην επεξεργασία που κάνει η ίδια η PHP γύρω από το αίτημα, όχι στον κώδικα της εφαρμογής. Η ομάδα της PHP κατατάσσει τον κίνδυνο στο mod_php ως τον υψηλότερο· εκεί επιδείχθηκε exploit προτού καν εκτελεστεί κώδικας εφαρμογής. Κανένα filter_var() και κανένας έλεγχος στην εφαρμογή δεν μπορεί να το εμποδίσει.
Υποχρεωτική είναι η ενημέρωση στις PHP 8.5.12, 8.4.27, 8.3.36 ή 8.2.35 και η επανεκκίνηση όλων των διεργασιών PHP. Τα προσωρινά μέτρα του php.net, όπως στενότερα όρια για το post_max_size, δεν αποτελούν πλήρη προστασία.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Ελέγχουμε τα πράγματι ισχύοντα όρια για τα δεδομένα αιτημάτων ανά ιστότοπο και τα ορίζουμε ανάλογα με την εφαρμογή.
- Εφαρμόζουμε την ενημέρωση της PHP, επανεκκινούμε όλους τους workers και τεκμηριώνουμε το επίπεδο patch στο πλαίσιο της υπηρεσίας PHP-Patch.
- Ελέγχουμε τις ιδιοκατασκευές για το αν τιμές από superglobals καταλήγουν ανέλεγκτες σε βάση δεδομένων, σύστημα αρχείων ή έξοδο.
- Διασώζουμε τα logs του διακομιστή ιστού από τις 20.10.2026, ώστε να παραμένει δυνατή μια μεταγενέστερη αξιολόγηση.
Συχνές ερωτήσεις
Πόσα superglobals υπάρχουν στην PHP;
Το εγχειρίδιο της PHP αναφέρει εννέα: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST και $_ENV. Είναι διαθέσιμα σε κάθε πεδίο ισχύος, ακόμη και σε συναρτήσεις και μεθόδους.
Είναι αξιόπιστες οι τιμές στο $_SERVER;
Μόνο εν μέρει. Οι εγγραφές με HTTP_ στην αρχή προέρχονται από τις κεφαλίδες αιτήματος του πελάτη. Το εγχειρίδιο προειδοποιεί για παράδειγμα ότι το SERVER_NAME μπορεί να αντανακλά το όνομα host που παρέχει ο πελάτης και δεν είναι αξιόπιστο για αποφάσεις ασφαλείας.
Γιατί το $_POST είναι μερικές φορές κενό, αν και στάλθηκε μια φόρμα;
Συχνότερη αιτία είναι ένα αίτημα μεγαλύτερο από το post_max_size. Τότε τα $_POST και $_FILES παραμένουν σύμφωνα με το εγχειρίδιο κενά. Και μια απενεργοποιημένη ρύθμιση enable_post_data_reading οδηγεί σε αυτό.
Πρέπει να χρησιμοποιείται το $_REQUEST;
Καλύτερα όχι. Το $_REQUEST αναμειγνύει δεδομένα από διαφορετικές πηγές και το ποια πηγή υπερισχύει εξαρτάται από τα request_order και variables_order. Διαβάστε τις τιμές στοχευμένα από το $_GET ή το $_POST.