# Προστασία REST API στην PHP

> Προστασία REST API στην PHP: πιστοποίηση, έλεγχος ανά αντικείμενο, JWT, όρια μεγέθους και τύπου, μηνύματα σφάλματος και περιορισμός ρυθμού με κώδικα.

Πηγή: https://phpsos.de/el/blog/rest-api-php-absichern/  
Ημερομηνία: 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

**Εν ολίγοις:** Για την ασφάλεια API στην PHP μετρούν κυρίως πέντε σημεία: μόνο HTTPS, πιστοποίηση σε κάθε μη δημόσιο endpoint, έλεγχος δικαιωμάτων για κάθε μεμονωμένο αντικείμενο, αυστηρά όρια για μέθοδο, τύπο περιεχομένου και μέγεθος του αιτήματος, καθώς και σύντομα μηνύματα σφάλματος χωρίς εσωτερικές λεπτομέρειες. Προστίθενται ο περιορισμός ρυθμού και μια καταγραφή συμβάντων σχετικών με την ασφάλεια. Απέναντι σε ευπάθειες στον ίδιο τον διερμηνέα PHP όπως το PHP2Shell αυτό δεν βοηθά· γι' αυτό χρειάζεται η ενημέρωση της PHP.

## Η διεπαφή πίσω από τον ιστότοπο

Πολλές επιχειρήσεις έλεγξαν την εβδομάδα μετά τις 21/10/2026 τους ιστότοπούς τους. Οι διεπαφές πίσω από αυτούς βρίσκονταν σπανιότερα στη λίστα. Εκεί όμως εκτελούνται ευαίσθητες διαδικασίες: η εφαρμογή της πύλης πελατών ανακτά τιμολόγια, το σύστημα διαχείρισης αποθεμάτων γράφει αποθέματα στο κατάστημα, ένας συνεργάτης δηλώνει παραγγελίες με webhook. Συχνά αυτά τα API χτίστηκαν γρήγορα, για έναν και μόνο σκοπό, και έπειτα δεν ξαναεξετάστηκαν ποτέ.

Ένα API δεν έχει διεπαφή χρήστη που να κάνει τα σφάλματα ορατά. Ένας ελλιπής έλεγχος δικαιωμάτων δεν προσέχεται από κανέναν στην καθημερινότητα, όσο όλοι οι πελάτες ρωτούν μόνο ό,τι πρέπει. Ένας επιτιθέμενος δοκιμάζει αντίθετα ακριβώς ό,τι δεν προβλέπεται.

Το πρώτο βήμα είναι γι' αυτό η καταγραφή της υπάρχουσας κατάστασης. Ποια endpoints υπάρχουν εν γένει; Συχνά βρίσκονται παλιές εκδόσεις όπως το `/api/v1/`, που δεν απενεργοποιήθηκαν ποτέ μετά τη μετάβαση στο `/v2/`, endpoints δοκιμών από την ανάπτυξη ή μια δημόσια προσβάσιμη περιγραφή της διεπαφής που παραθέτει εσωτερικές λειτουργίες. Κάθε endpoint που δεν χρειάζεται πια, πρέπει να απενεργοποιηθεί. Κάθε endpoint που μένει, χρειάζεται έναν υπεύθυνο.

## Ασφάλεια API στην PHP: οι βασικοί κανόνες

Το OWASP REST Security Cheat Sheet συνοψίζει δοκιμασμένους κανόνες. Για έργα PHP μπορούν να μεταφραστούν σε μια σύντομη λίστα:

1. **Μόνο HTTPS.** Τα tokens και τα στοιχεία πρόσβασης δεν επιτρέπεται να μεταδίδονται ποτέ μη κρυπτογραφημένα.
2. **Κάθε endpoint ελέγχει μόνο του.** Η πιστοποίηση μπορεί να γίνεται κεντρικά, η απόφαση για την πρόσβαση λαμβάνεται στο endpoint.
3. **Δικαίωμα ανά αντικείμενο.** Όχι μόνο «είναι συνδεδεμένος», αλλά «επιτρέπεται ακριβώς αυτή η εγγραφή».
4. **Ορισμός επιτρεπόμενων μεθόδων.** Ό,τι δεν επιτρέπεται ρητά, απορρίπτεται με 405.
5. **Έλεγχος τύπου περιεχομένου και μεγέθους.** Λανθασμένος τύπος δίνει 415, υπερβολικά μεγάλα αιτήματα 413.
6. **Επικύρωση εισόδων.** Τύπος, μήκος, μορφή και εύρος τιμών, από την πλευρά του διακομιστή.
7. **Κανένα μυστικό σε URL.** Τα tokens και τα κλειδιά ανήκουν σε κεφαλίδες και όχι στο query string.
8. **Σύντομα σφάλματα.** Χωρίς stack traces, διαδρομές ή μηνύματα SQL προς τον πελάτη.
9. **Περιορισμός ρυθμού.** Τα υπερβολικά πολλά αιτήματα απαντώνται με 429.
10. **Απομόνωση των endpoints διαχείρισης.** Να μην είναι δημόσια προσβάσιμα ή μόνο με ισχυρή σύνδεση.

## Δικαίωμα ανά αντικείμενο: το πιο συχνό σφάλμα

Ένα παράδειγμα κάνει το πρόβλημα χειροπιαστό. Ένα endpoint παραδίδει τιμολόγια στο `/api/rechnungen/{id}`. Ελέγχεται αν υπάρχει έγκυρο token. Δεν ελέγχεται αν το τιμολόγιο ανήκει στον πελάτη του token. Όποιος αυξήσει κατά ένα τον δικό του αριθμό τιμολογίου, βλέπει του γείτονα.

Η λύση είναι απλή και πρέπει παρ' όλα αυτά να εφαρμοστεί σε κάθε σημείο: το ίδιο το ερώτημα περιορίζει στην εξουσιοδοτημένη περιοχή.

```php
<?php
// να επιτρέπεται μόνο η μέθοδος GET
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    http_response_code(405);
    header('Allow: GET');
    exit;
}

$kundeId = $auth->kundeId();          // από το ελεγμένο token
$id = filter_var($routeId, FILTER_VALIDATE_INT);
if ($id === false) {
    http_response_code(400);
    exit;
}

// Το δικαίωμα βρίσκεται μέσα στο ερώτημα: μόνο τα δικά του τιμολόγια
$stmt = $pdo->prepare('SELECT nummer, betrag, datum FROM rechnungen WHERE id = ? AND kunde_id = ?');
$stmt->execute([$id, $kundeId]);
$rechnung = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$rechnung) {
    http_response_code(404);           // να μην αποκαλυφθεί αν υπάρχει το αναγνωριστικό
    exit;
}

header('Content-Type: application/json');
echo json_encode($rechnung, JSON_THROW_ON_ERROR);
```

Το ερώτημα με placeholders προστατεύει ταυτόχρονα από το SQL injection, δείτε [Αποτροπή του SQL injection στην PHP](https://phpsos.de/el/ratgeber/sql-injection-php/). Πώς παρέχει η PHP δεδομένα αιτήματος όπως μέθοδο, κεφαλίδες και σώμα, εξηγεί το [Superglobals: $_GET, $_POST, $_FILES και τα υπόλοιπα](https://phpsos.de/el/php/superglobals/).

## Σωστός έλεγχος των tokens

Πολλά API λειτουργούν με JSON Web Tokens. Το OWASP Cheat Sheet ορίζει γι' αυτά σαφείς κανόνες: τα tokens πρέπει να είναι υπογεγραμμένα, τα ανυπόγραφα tokens απορρίπτονται και ο αλγόριθμος για τον έλεγχο ορίζεται στον διακομιστή και δεν λαμβάνεται από το token. Εκδότης, κοινό και χρόνος λήξης ανήκουν επίσης στον έλεγχο. Χρησιμοποιήστε γι' αυτό μια συντηρούμενη βιβλιοθήκη αντί για δικές σας υλοποιήσεις.

Τα δικά σας tokens, για παράδειγμα για webhooks ή συνδέσμους μίας χρήσης, πρέπει να προέρχονται από κρυπτογραφικά ασφαλή γεννήτρια τυχαίων αριθμών και να συγκρίνονται σε σταθερό χρόνο. Πώς γίνεται στην PHP, δείχνει το [Ασφαλείς τυχαίοι αριθμοί και tokens στην PHP](https://phpsos.de/el/blog/sichere-tokens-php/).

> **Συμβουλή:**
> Δώστε σε κάθε πελάτη και κάθε συνεργάτη ένα δικό του κλειδί με ακριβώς τα δικαιώματα που χρειάζεται. Τότε ένα κλειδί που διέρρευσε μπορεί να αποκλειστεί μεμονωμένα, χωρίς να διακοπούν όλες οι υπόλοιπες συνδέσεις.

## Ορισμός ορίων: μέγεθος, τύπος και ρυθμός

Ένα API πρέπει να δέχεται μόνο ό,τι περιμένει. Αυτό αρχίζει από τον τύπο περιεχομένου: ένα endpoint που επεξεργάζεται JSON απορρίπτει όλα τα άλλα. Το μέγιστο μέγεθος ενός αιτήματος το περιορίζετε σε περισσότερα επίπεδα, στον διακομιστή ιστού και στην PHP μέσω `post_max_size`. Αυτό το όριο ανήκει και στα μεταβατικά μέτρα που ανέφερε το php.net για το PHP2Shell. Πώς το επιλέγετε με νόημα, περιγράφει το [Λογικός περιορισμός των post_max_size και upload_max_filesize](https://phpsos.de/el/blog/post-max-size-upload-limits/).

Ο περιορισμός ρυθμού προστατεύει από τη δοκιμή αναγνωριστικών και από υπερφόρτωση. Μπορεί να υλοποιηθεί στον διακομιστή ιστού, σε έναν proxy που παρεμβάλλεται ή στην εφαρμογή. Σημασία έχει τα όρια να ισχύουν ανά κλειδί ή χρήστη και όχι μόνο ανά διεύθυνση IP.

Για API που καλούνται απευθείας από τον browser προστίθεται το CORS, δηλαδή οι κανόνες για το ποιοι ξένοι ιστότοποι επιτρέπεται να στέλνουν αιτήματα. Ορίστε αυτές τις κεφαλίδες μόνο αν τέτοιες κλήσεις προβλέπονται πραγματικά, και αναφέρετε μία προς μία τις επιτρεπόμενες προελεύσεις, αντί να επιτρέπετε κάθε προέλευση. Ένας χαρακτήρας μπαλαντέρ που επιτρέπει όλους τους ιστότοπους είναι σε endpoints με σύνδεση σχεδόν πάντα σφάλμα.

Τέλος η καταγραφή: αποτυχημένες συνδέσεις, απορριφθέντα tokens και απαγορευμένες προσβάσεις ανήκουν στο log, τα ίδια τα tokens όχι. Χωρίς αυτές τις εγγραφές μια επίθεση στο API παραμένει αόρατη.

## Πώς βοηθά συγκεκριμένα η PHP SOS;

- Καταγράφουμε όλες τις διεπαφές των συστημάτων PHP σας, και τις ξεχασμένες και τις εσωτερικές, και ελέγχουμε ποιες είναι δημόσια προσβάσιμες.
- Διαβάζουμε τη λογική δικαιωμάτων και δοκιμάζουμε στοχευμένα αν ανακτώνται ξένες εγγραφές.
- Ορίζουμε όρια για μέγεθος, τύπο και ρυθμό στον διακομιστή ιστού και στην PHP και τα συντονίζουμε με τους πελάτες σας.
- Για έναν ολοκληρωμένο έλεγχο από έξω τον συνδυάζουμε με [έλεγχο ασφαλείας και δοκιμή διείσδυσης](https://phpsos.de/el/leistungen/sicherheitsaudit-penetrationstest/).

**Συμπέρασμα:** Ένα API είναι τόσο ασφαλές όσο το πιο αμελές του endpoint. Όποιος ελέγχει δικαιώματα ανά αντικείμενο, ορίζει σαφή όρια και κρατά τα σφάλματα σύντομα, κλείνει τις πιο συχνές ευπάθειες πολύ πριν κάποιος τις αναζητήσει στοχευμένα.


## Συχνές ερωτήσεις

**Αρκεί ένα κλειδί API ως προστασία;**  
Για ευαίσθητα δεδομένα όχι. Ένα κλειδί API αναγνωρίζει συνήθως μια εφαρμογή και όχι έναν χρήστη, και μεταβιβάζεται εύκολα. Το OWASP REST Security Cheat Sheet συμβουλεύει να μη χρησιμοποιούνται τα κλειδιά API ως η μοναδική προστασία για ευαίσθητους πόρους.

**Τι είναι το δικαίωμα ανά αντικείμενο και γιατί λείπει τόσο συχνά;**  
Εννοείται ο έλεγχος αν ο συνδεδεμένος χρήστης επιτρέπεται να δει ή να αλλάξει ακριβώς αυτή την εγγραφή. Λείπει συχνά, επειδή οι προγραμματιστές ελέγχουν μόνο αν είναι εν γένει κάποιος συνδεδεμένος. Τότε αρκεί να αλλάξει κανείς ένα αναγνωριστικό στο URL για να ανακτήσει ξένα δεδομένα.

**Προστατεύει ένα καλά ασφαλισμένο API από το PHP2Shell;**  
Όχι. Το PHP2Shell βρίσκεται στον διερμηνέα PHP και δρα στους επηρεαζόμενους τρόπους λειτουργίας προτού εκτελεστεί καν ο κώδικάς σας. Απέναντι σε αυτό βοηθά μόνο μια ενημέρωση της PHP με επανεκκίνηση. Τα όρια μεγέθους για τα αιτήματα έχουν παρ' όλα αυτά νόημα και ανήκουν επίσης στα μεταβατικά μέτρα του php.net.

**Ποιους κωδικούς κατάστασης πρέπει να επιστρέφει ένα API σε σφάλματα ασφαλείας;**  
Συνηθισμένοι είναι ο 401 χωρίς έγκυρη σύνδεση, ο 403 για ελλιπές δικαίωμα, ο 405 για μη επιτρεπτή μέθοδο, ο 413 για υπερβολικά μεγάλο αίτημα, ο 415 για λανθασμένο τύπο περιεχομένου και ο 429 για υπερβολικά πολλά αιτήματα. Η ίδια η απάντηση παραμένει σύντομη και χωρίς εσωτερικές λεπτομέρειες.

## Πηγές

- [OWASP: REST Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [Εγχειρίδιο της PHP](https://www.php.net/manual/de/)
- [php.net: ανακοινώσεις ασφαλείας](https://www.php.net/)
