# Λογικός περιορισμός των post_max_size και upload_max_filesize

> Όρια post_max_size και upload_max_filesize: συνδυασμός με τα όρια του διακομιστή ιστού, μεταβατικές τιμές του php.net για το PHP2Shell και τυπικά σφάλματα.

Πηγή: https://phpsos.de/el/blog/post-max-size-upload-limits/  
Ημερομηνία: 25/10/2026  
Πάροχος: PHP SOS, Επείγουσα βοήθεια PHP και ασφάλεια διακομιστών. Άμεση βοήθεια μέσω WhatsApp: https://wa.me/491736494914?text=%CE%93%CE%B5%CE%B9%CE%B1%20%CF%83%CE%B1%CF%82%2C%20PHP%20SOS%2C%20%CF%87%CF%81%CE%B5%CE%B9%CE%B1%CE%B6%CF%8C%CE%BC%CE%B1%CF%83%CF%84%CE%B5%20%CE%B2%CE%BF%CE%AE%CE%B8%CE%B5%CE%B9%CE%B1%20%CE%BC%CE%B5%20%CF%84%CE%BF%CE%BD%20%CE%B4%CE%B9%CE%B1%CE%BA%CE%BF%CE%BC%CE%B9%CF%83%CF%84%CE%AE%20PHP%20%CE%BC%CE%B1%CF%82.%20%CE%95%CF%84%CE%B1%CE%B9%CF%81%CE%B5%CE%AF%CE%B1%3A%20%E2%80%A6%20%CE%99%CF%83%CF%84%CF%8C%CF%84%CE%BF%CF%80%CE%BF%CF%82%3A%20%E2%80%A6

**Εν ολίγοις:** Το `post_max_size` περιορίζει το συνολικό μέγεθος ενός αιτήματος POST, το `upload_max_filesize` το μεμονωμένο αρχείο· οι προεπιλογές είναι σύμφωνα με το εγχειρίδιο της PHP 8M και 2M. Οι τιμές πρέπει να ταιριάζουν με τα όρια στον διακομιστή ιστού και στην εφαρμογή, αλλιώς τα ανεβάσματα αποτυγχάνουν χωρίς σαφές μήνυμα. Μέχρι την ενημέρωση για το PHP2Shell το php.net συνιστά `post_max_size = 8M` χωρίς ανεβάσματα ή `32M` με ανεβάσματα, το `upload_max_filesize` χαμηλότερα, ορισμένα έτσι ώστε οι εφαρμογές να μην μπορούν να το αντικαταστήσουν.

## Όταν η φόρμα αιτήσεων ξαφνικά σιωπά

Μετά τα μεταβατικά μέτρα για το PHP2Shell πολλοί διαχειριστές μείωσαν το `post_max_size`. Λίγες ημέρες αργότερα το τμήμα προσωπικού αναφέρει ότι δεν φτάνουν πλέον αιτήσεις εργασίας. Η φόρμα απλώς φορτώνει ξανά, μήνυμα σφάλματος δεν υπάρχει. Ο λόγος: το αίτημα με τρία συνημμένα PDF ήταν μεγαλύτερο από το νέο όριο και η PHP απέρριψε τα δεδομένα της φόρμας.

Το παράδειγμα δείχνει το βασικό πρόβλημα. Τα όρια ανεβάσματος ισχύουν ταυτόχρονα σε περισσότερα σημεία και κάθε σημείο αντιδρά διαφορετικά όταν υπερβαίνεται. Όποιος γνωρίζει την αλυσίδα μπορεί να ορίσει τις τιμές έτσι ώστε να προστατεύουν χωρίς να διαταράσσουν τη λειτουργία. Πώς επεξεργάζεται η PHP εσωτερικά τα ανεβάσματα, εξηγεί το [Πώς επεξεργάζεται η PHP τα ανεβάσματα αρχείων](https://phpsos.de/el/php/datei-uploads-intern/)· τον ασφαλή προγραμματισμό των λειτουργιών ανεβάσματος περιγράφει το [Ασφαλής υλοποίηση ανεβασμάτων αρχείων στην PHP](https://phpsos.de/el/ratgeber/datei-upload-sicher/).

## Η αλυσίδα των ορίων ανεβάσματος

Ένα αίτημα περνά από αρκετά όρια προτού το δει η εφαρμογή. Τα παρακάτω στοιχεία προέρχονται από την τεκμηρίωση του Nginx, του Apache και της PHP:

| Σημείο | Ρύθμιση | Προεπιλογή σύμφωνα με την τεκμηρίωση | Σε υπέρβαση |
|---|---|---|---|
| Nginx | `client_max_body_size` | 1m | σφάλμα 413 προς τον περιηγητή |
| Apache από 2.4.54 | `LimitRequestBody` | 1 GiB (έως 2.4.53: απεριόριστο) | απάντηση σφάλματος αντί για επεξεργασία |
| PHP | `post_max_size` | 8M | `$_POST` και `$_FILES` κενά |
| PHP | `upload_max_filesize` | 2M | το αρχείο απορρίπτεται με κωδικό σφάλματος |
| PHP | `max_file_uploads` | 20 | τα επιπλέον αρχεία αγνοούνται |
| PHP | `max_input_vars` | 1000 | λείπουν επιπλέον πεδία φόρμας |

Από αυτό προκύπτει ένας απλός κανόνας: `upload_max_filesize` μικρότερο από το `post_max_size`, `post_max_size` μικρότερο από το όριο στον διακομιστή ιστού. Το εγχειρίδιο της PHP συνιστά επιπλέον το `memory_limit` να είναι γενικά μεγαλύτερο από το `post_max_size`. Κατά το μεταβατικό μέτρο του PHP2Shell με `memory_limit=-1`, αυτόν τον ρόλο αναλαμβάνει το όριο μέσω container ή cgroup· περισσότερα στο [Σωστή ρύθμιση του memory_limit](https://phpsos.de/el/blog/memory-limit-richtig-setzen/).

## post_max_size μετά το PHP2Shell: τι συνιστά το php.net

Στην ανακοίνωση ασφαλείας της 21/10/2026 το php.net αναφέρει για διακομιστές χωρίς ενημέρωση χαμηλά όρια αιτημάτων ως ένα από τα μεταβατικά μέτρα. Μειώνουν τον κίνδυνο μεμονωμένων οδών επίθεσης, αλλά ρητά δεν αποτελούν πλήρη προστασία:

1. **Χωρίς ανεβάσματα αρχείων:** `post_max_size = 8M`.
2. **Με ανεβάσματα αρχείων:** `post_max_size = 32M`.
3. **Και στις δύο περιπτώσεις:** κρατήστε το `upload_max_filesize` κάτω από το `post_max_size`.
4. **Επιπλέον εξετάστε:** όρια στον διακομιστή ιστού ή στον proxy για το αποκωδικοποιημένο μέγεθος αιτήματος, τον αριθμό των πεδίων εισόδου, τον αριθμό των τμημάτων multipart, τον αριθμό των κεφαλίδων και το βάθος εμφώλευσης. Σύμφωνα με το php.net, αυτά τα όρια πρέπει να καλύπτουν και αιτήματα χωρίς αξιοποιήσιμη ένδειξη `Content-Length`.

Οι τιμές ανήκουν εκεί όπου οι εφαρμογές δεν μπορούν να τις αντικαταστήσουν. Επειδή τα `post_max_size` και `upload_max_filesize` μπορούν σύμφωνα με το εγχειρίδιο να αλλάξουν σε επίπεδο φακέλου, ένα `.user.ini` ή, με mod_php, ένα `.htaccess` θα μπορούσε αλλιώς να τα ανεβάσει ξανά:

```ini
; Pool FPM του ιστοτόπου, με ανεβάσματα (μετάβαση μέχρι την ενημέρωση)
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 24M
php_admin_value[max_file_uploads] = 5
```

Στον διακομιστή ιστού τραβάτε το όριο λίγο πιο πάνω, ώστε τα υπερβολικά μεγάλα αιτήματα να μην φτάνουν καν στην PHP:

```nginx
# Nginx, στο μπλοκ server ή location
client_max_body_size 32m;
```

```apache
# Apache, στο VirtualHost: 32 MiB σε bytes
LimitRequestBody 33554432
```

Στη συνέχεια επαναφορτώστε όλους τους workers της PHP και τον διακομιστή ιστού. Η επισκόπηση όλων των μεταβατικών μέτρων υπάρχει στο [Άμεσα μέτρα όταν δεν μπορείτε ακόμη να εφαρμόσετε patch](https://phpsos.de/el/php2shell/sofortmassnahmen-ohne-patch/). Αν και πώς μπορούν επιπλέον να φιλτραριστούν τα αιτήματα ανεβάσματος στον proxy, εξετάζει το [Φιλτράρισμα αιτημάτων ανεβάσματος στο όριο του δικτύου](https://phpsos.de/el/blog/upload-anfragen-am-rand-filtern/).

> **Σημαντικό:**
> Δοκιμάστε μετά από κάθε αλλαγή τις φόρμες με τα μεγαλύτερα θεμιτά αιτήματα: αιτήσεις με πολλά συνημμένα, εισαγωγές προϊόντων, γκαλερί εικόνων. Μια υπερβολικά στενή τιμή παραλύει επιχειρησιακές διαδικασίες, χωρίς να δει κανείς μήνυμα σφάλματος.

## Εύρεση της σωστής τιμής για τον ιστότοπό σας

Αντί για γενικές τιμές αξίζει μια σύντομη καταγραφή. Απαριθμήστε όλες τις φόρμες με ανεβάσματα και σημειώστε το μεγαλύτερο θεμιτό αρχείο και τον μεγαλύτερο αριθμό ταυτόχρονων αρχείων. Από αυτό προκύπτει η ανάγκη: το `upload_max_filesize` καλύπτει το μεγαλύτερο μεμονωμένο αρχείο, το `post_max_size` το άθροισμα όλων των αρχείων ενός αιτήματος συν λίγο περιθώριο για τα πεδία της φόρμας.

Αν η ανάγκη ξεπερνά τα 32M, δεν ταιριάζει με τη μεταβατική σύσταση του php.net. Τότε αυτός είναι ένας ακόμη λόγος να προτιμήσετε νωρίτερα την ενημέρωση. Μεγάλα ανεβάσματα μπορούν να διεκπεραιωθούν και μέσω ξεχωριστού υποτομέα με δικό του pool, ώστε ο υπόλοιπος ιστότοπος να διατηρεί στενά όρια.

Μετά την ενημέρωση σε 8.5.12, 8.4.27, 8.3.36, 8.2.35 ή σε επιβεβαιωμένο backport μπορείτε να προσαρμόσετε ξανά τις τιμές στην πραγματική ανάγκη. Δεν πρέπει όμως να είναι πιο γενναιόδωρες από όσο χρειάζεται: κάθε όριο που ξεπερνά την ανάγκη μεγαλώνει την επιφάνεια επίθεσης χωρίς όφελος. Αν ένας ιστότοπος δεν χρειάζεται καθόλου ανεβάσματα, το `file_uploads = Off` είναι η καθαρότερη λύση.

## Σωστή ερμηνεία των εικόνων σφάλματος

Όταν αποτυγχάνουν τα ανεβάσματα, η συμπεριφορά αποκαλύπτει ποιο όριο ενεργοποιείται. Μια σελίδα με σφάλμα 413 προέρχεται από τον διακομιστή ιστού. Μια φόρμα που φορτώνει ξανά χωρίς μήνυμα ή αναφέρει «μη έγκυρο αίτημα» υποδεικνύει κενά δεδομένα `$_POST`, δηλαδή `post_max_size`. Ένα μήνυμα της εφαρμογής για ένα μεμονωμένο αρχείο ταιριάζει με το `upload_max_filesize`. Και τα πεδία που λείπουν σε πολύ μεγάλες φόρμες, για παράδειγμα σε παραλλαγές προϊόντων, δείχνουν `max_input_vars`. Το log σφαλμάτων της PHP περιέχει συνήθως, όταν υπερβαίνεται το `post_max_size`, μια προειδοποίηση με το μέγεθος του αιτήματος.

Για να μην μένουν οι χρήστες αβοήθητοι, η εφαρμογή πρέπει να αναγνωρίζει την περίπτωση. Το εγχειρίδιο της PHP προτείνει έναν απλό τρόπο: η φόρμα περνά έναν δείκτη στη διεύθυνση, για παράδειγμα `?processed=1`. Αν ο δείκτης φτάσει, αλλά τα `$_POST` και `$_FILES` είναι κενά, το αίτημα ήταν υπερβολικά μεγάλο και η εφαρμογή μπορεί να εμφανίσει ένα κατανοητό μήνυμα με το επιτρεπόμενο μέγεθος.

## Πώς βοηθά συγκεκριμένα η PHP SOS;

- Καταγράφουμε όλες τις διαδρομές ανεβάσματος των ιστοτόπων σας και εντοπίζουμε τα μεγέθη που πραγματικά απαιτούνται.
- Ορίζουμε συνεπή όρια διακομιστή ιστού, PHP και pool, κλειδωμένα κατά της αντικατάστασης, συμπεριλαμβανομένων των μεταβατικών τιμών του php.net.
- Δοκιμάζουμε φόρμες, εισαγωγές και ανεβάσματα μετά τη μετάβαση και προσαρμόζουμε στοχευμένα τις τιμές.
- Στο πλαίσιο της [σκλήρυνσης διακομιστή](https://phpsos.de/el/leistungen/server-haertung/) επαναφέρουμε μετά την ενημέρωση τις τιμές στη μόνιμη ανάγκη.


## Συχνές ερωτήσεις

**Ποια είναι η διαφορά ανάμεσα στο post_max_size και στο upload_max_filesize;**  
Το upload_max_filesize περιορίζει το μέγεθος ενός μεμονωμένου αρχείου που ανεβαίνει. Το post_max_size περιορίζει το σύνολο των δεδομένων ενός αιτήματος POST, δηλαδή όλα τα αρχεία και τα πεδία φόρμας μαζί. Σύμφωνα με το εγχειρίδιο της PHP, το post_max_size πρέπει γι' αυτό να είναι μεγαλύτερο από το upload_max_filesize.

**Τι συμβαίνει όταν ένα αίτημα είναι μεγαλύτερο από το post_max_size;**  
Σύμφωνα με το εγχειρίδιο της PHP, τότε τα $_POST και $_FILES είναι κενά. Η εφαρμογή δεν λαμβάνει επομένως καθόλου δεδομένα φόρμας και συχνά εμφανίζει μόνο ασαφές μήνυμα σφάλματος ή φορτώνει ξανά τη φόρμα. Αυτό κάνει το σφάλμα δύσκολο να εντοπιστεί.

**Ποιες τιμές συνιστά το php.net εξαιτίας του PHP2Shell;**  
Ως μεταβατικό μέτρο μέχρι την ενημέρωση: post_max_size = 8M για εφαρμογές χωρίς ανεβάσματα αρχείων, 32M για εφαρμογές με ανεβάσματα και upload_max_filesize χαμηλότερα. Σύμφωνα με το php.net αυτό δεν αποτελεί πλήρη προστασία· μόνο η ενημέρωση σε διορθωμένη έκδοση PHP κλείνει τις ευπάθειες.

**Μπορώ να αλλάξω το post_max_size με ini_set() στον κώδικα;**  
Όχι. Σύμφωνα με το εγχειρίδιο της PHP, το post_max_size μπορεί να αλλάξει μόνο σε επίπεδο φακέλου, για παράδειγμα στο php.ini, στο pool FPM, στο .user.ini ή, με mod_php, στο .htaccess. Όποιος θέλει να επιβάλει την τιμή, την ορίζει με php_admin_value, οπότε ούτε ένα .user.ini μπορεί να την αντικαταστήσει.

## Πηγές

- [php.net: ανακοίνωση ασφαλείας της 21/10/2026](https://www.php.net/)
- [Εγχειρίδιο της PHP: βασικές ρυθμίσεις (post_max_size)](https://www.php.net/manual/en/ini.core.php)
- [Τεκμηρίωση του Nginx: client_max_body_size](https://nginx.org/en/docs/http/ngx_http_core_module.html)
- [Τεκμηρίωση του Apache: LimitRequestBody](https://httpd.apache.org/docs/2.4/mod/core.html)
