Τρέχουσα κατάσταση: PHP2Shell. Δύο κρίσιμες ευπάθειες της PHP (CVSS 9.2) επιτρέπουν κακόβουλο κώδικα χωρίς σύνδεση. Patches από τις 21/10/2026.Τι πρέπει να γίνει τώρα →

Superglobals: $_GET, $_POST, $_FILES και άλλα

Τα superglobals είναι οι πίνακες μέσω των οποίων ο κώδικας PHP φτάνει στα δεδομένα αιτημάτων. Όποιος γνωρίζει πώς τα γεμίζει η PHP και ποια όρια ισχύουν, γράφει ασφαλέστερο κώδικα και κατανοεί καλύτερα το PHP2Shell.

Ημερομηνία 5 λεπτά ανάγνωσηςΓνώση PHP

Εν συντομία: Τα 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 έχει ήδη εργαστεί. Διαβάζει τη διεύθυνση, τις κεφαλίδες και το περιεχόμενο του αιτήματος, τα αναλύει και τοποθετεί τα αποτελέσματα στους πίνακες. Αυτό το βήμα ελέγχουν πολλές ρυθμίσεις:

  1. variables_order (προεπιλογή EGPCS) καθορίζει ποια superglobals δημιουργούνται καθόλου: Environment, GET, POST, Cookie, Server.
  2. request_order (προεπιλογή κενό) καθορίζει από τι σχηματίζεται το $_REQUEST. Αν είναι κενό, ισχύει το variables_order. Τα αρχεία php.ini που συνοδεύουν την PHP παραλείπουν σύμφωνα με το εγχειρίδιο τα cookies για λόγους ασφαλείας.
  3. max_input_vars (προεπιλογή 1000) και max_input_nesting_level (προεπιλογή 64) περιορίζουν τον αριθμό και την ένθεση των μεταβλητών εισόδου.
  4. post_max_size (προεπιλογή 8M) περιορίζει το περιεχόμενο του αιτήματος. Αν ένα αίτημα είναι μεγαλύτερο, τα $_POST και $_FILES παραμένουν κενά.
  5. 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.

Πηγές

Άμεση επικοινωνία

Κάθε ώρα μετράει. Γράψτε μας τώρα.

Περιγράψτε σύντομα το σύστημα, την έκδοση PHP και ό,τι παρατηρείτε. Θα επικοινωνήσουμε μαζί σας, θα διευκρινίσουμε την κατάσταση και θα εργαστούμε εξ αποστάσεως μέχρι το περιστατικό να κλείσει και να τεκμηριωθεί.

Άμεση βοήθεια