Εν συντομία: Τα PSR (PHP Standards Recommendations) είναι πρότυπα του PHP-FIG, μιας ομάδας καθιερωμένων έργων PHP. Ορίζουν κοινούς κανόνες και διεπαφές, όπως το PSR-4 για το autoloading, το PSR-3 για loggers, το PSR-7 για μηνύματα HTTP και το PSR-11 για containers. Κάθε PSR έχει μια κατάσταση: αποδεκτό, προσχέδιο, παρωχημένο ή εγκαταλελειμμένο. Τα PSR κάνουν τον κώδικα πιο εναλλάξιμο και ευκολότερο στον έλεγχο, δεν κλείνουν όμως ευπάθειες του διερμηνέα της PHP, όπως το PHP2Shell.
Τι είναι το PHP-FIG και τι είναι τα PSR;
Το PHP-FIG σημαίνει PHP Framework Interop Group. Η ομάδα περιγράφει η ίδια τον στόχο της ως την προώθηση της PHP μέσω συνεργασίας και προτύπων. Πίσω από ένα PSR δεν βρίσκεται επομένως κάποιος κατασκευαστής, αλλά μια συμφωνία μεταξύ έργων που θέλουν να διατηρούν το λογισμικό τους συμβατό μεταξύ τους.
Για όσους αποφασίζουν το όφελος είναι χειροπιαστό: αν μια εφαρμογή τηρεί διεπαφές PSR, η βιβλιοθήκη καταγραφής μπορεί να αντικατασταθεί χωρίς να πειραχτεί ολόκληρος ο κώδικας. Αυτό μειώνει την εξάρτηση από μεμονωμένα πακέτα και παρόχους.
Η πορεία ενός PSR: από το Pre-Draft ως το Accepted
Ο κανονισμός του PHP-FIG περιγράφει μια σταθερή διαδικασία:
- Pre-Draft: Διερευνάται αν υπάρχει αρκετό ενδιαφέρον. Σχηματίζεται μια ομάδα εργασίας και, μετά από επιτυχή ψηφοφορία, η πρόταση λαμβάνει αριθμό PSR.
- Draft: Η πρόταση επεξεργάζεται, εναλλακτικές και αιτιολογήσεις καταχωρίζονται σε ένα μετα-έγγραφο.
- Review: Η κοινότητα δοκιμάζει την προδιαγραφή με δοκιμαστικές υλοποιήσεις, για τουλάχιστον τέσσερις εβδομάδες και μέχρι να υπάρξουν δύο ανεξάρτητες, βιώσιμες υλοποιήσεις.
- Accepted: Μετά από επιτυχή ψηφοφορία το PSR εγκρίνεται· η ομάδα εργασίας διαλύεται.
Επιπλέον υπάρχουν δύο ακόμη καταστάσεις. Το Deprecated σημαίνει: εγκεκριμένο, αλλά δεν συνιστάται πλέον, συνήθως επειδή το αντικατέστησε ένα νεότερο πρότυπο. Το Abandoned σημαίνει: δεν εργάζεται πλέον κανείς σε αυτό.
Όλα τα PSR με την κατάστασή τους
Κατάσταση σύμφωνα με την επισκόπηση του PHP-FIG κατά τη στιγμή αυτής της σελίδας:
| Αρ. | Τίτλος | Κατάσταση |
|---|---|---|
| PSR-0 | Autoloading Standard | παρωχημένο |
| PSR-1 | Basic Coding Standard | αποδεκτό |
| PSR-2 | Coding Style Guide | παρωχημένο |
| PSR-3 | Logger Interface | αποδεκτό |
| PSR-4 | Autoloading Standard | αποδεκτό |
| PSR-5 | PHPDoc Standard | προσχέδιο |
| PSR-6 | Caching Interface | αποδεκτό |
| PSR-7 | HTTP Message Interface | αποδεκτό |
| PSR-8 | Huggable Interface | εγκαταλελειμμένο |
| PSR-9 | Security Advisories | εγκαταλελειμμένο |
| PSR-10 | Security Reporting Process | εγκαταλελειμμένο |
| PSR-11 | Container Interface | αποδεκτό |
| PSR-12 | Extended Coding Style Guide | αποδεκτό |
| PSR-13 | Hypermedia Links | αποδεκτό |
| PSR-14 | Event Dispatcher | αποδεκτό |
| PSR-15 | HTTP Handlers | αποδεκτό |
| PSR-16 | Simple Cache | αποδεκτό |
| PSR-17 | HTTP Factories | αποδεκτό |
| PSR-18 | HTTP Client | αποδεκτό |
| PSR-19 | PHPDoc tags | προσχέδιο |
| PSR-20 | Clock | αποδεκτό |
| PSR-21 | Internationalization | προσχέδιο |
| PSR-22 | Application Tracing | προσχέδιο |
Τα σημαντικότερα PSR για την πράξη
- PSR-4 (Autoloading): αντιστοιχίζει ονόματα κλάσεων σε διαδρομές αρχείων και αποτελεί τη βάση του autoloader του Composer. Λεπτομέρειες στη σελίδα Namespaces και autoloading.
- PSR-1 και PER Coding Style: κοινοί κανόνες για τη γραφή και τη μορφοποίηση. Το PER Coding Style επεκτείνει και αντικαθιστά σύμφωνα με το PHP-FIG το PSR-12 και προϋποθέτει το PSR-1.
- PSR-3 (Logger): ενιαία διεπαφή logger στο namespace
Psr\Logμε οκτώ επίπεδα από τοemergencyως τοdebug. - PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): διεπαφές για αιτήματα και απαντήσεις, middleware, factories και πελάτες HTTP. Πολλά frameworks PHP βασίζονται σε αυτά ή προσφέρουν γέφυρες.
- PSR-11 (Container): κοινή διεπαφή για containers dependency injection.
- PSR-6 και PSR-16 (Cache): δύο διεπαφές για ενδιάμεση αποθήκευση, μία εκτενής και μία απλή.
- PSR-14 και PSR-20 (Events, Ρολόι): κοινές διεπαφές για γεγονότα και για την τρέχουσα ώρα. Ένα εναλλάξιμο ρολόι κάνει τον κώδικα που εξαρτάται από τον χρόνο, για παράδειγμα τη λήξη των tokens, εύκολα δοκιμάσιμο.
Οι αριθμοί, παρεμπιπτόντως, δεν λένε τίποτα για τη σημασία. Αποδίδονται κατά την είσοδο στη φάση προσχεδίου, γι' αυτό παρωχημένες και εγκαταλελειμμένες προτάσεις βρίσκονται ανάμεσα σε σημαντικά, αποδεκτά πρότυπα.
<?php
use Psr\Log\LoggerInterface;
final class Bestellimport
{
public function __construct(private LoggerInterface $log) {}
public function importieren(string $datei): void
{
try {
// ... επεξεργασία του αρχείου ...
} catch (\Throwable $e) {
$this->log->error('Import von {datei} fehlgeschlagen', [
'datei' => basename($datei),
'exception' => $e,
]);
}
}
}
Τι σχέση έχουν τα PSR με την ασφάλεια
Αρκετά πρότυπα αγγίζουν απευθείας την ασφάλεια. Το PSR-3 ορίζει ότι τα exceptions μεταβιβάζονται στο πλαίσιο (context) με το κλειδί exception και ότι τα σημεία αντικατάστασης όπως το {datei} αντικαθίστανται από το πλαίσιο. Οι τιμές δεν πρέπει να μασκάρονται εκ των προτέρων, επειδή ο logger δεν γνωρίζει πού θα εμφανιστούν αργότερα. Όποιος εμφανίζει logs σε διεπαφή ιστού, πρέπει να τα μασκάρει εκεί. Περισσότερα στο άρθρο Ασφαλής καταγραφή.
Το PSR-7 περιγράφει τα μηνύματα HTTP ως αμετάβλητα αντικείμενα και προσφέρει με το UploadedFileInterface::moveTo() έναν ενιαίο τρόπο αποθήκευσης των αρχείων που μεταφορτώθηκαν. Η προδιαγραφή απαιτεί να έχει αφαιρεθεί στη συνέχεια το αρχικό αρχείο. Ο έλεγχος του τύπου αρχείου και του προορισμού παραμένει έργο της εφαρμογής.
Αξιοσημείωτο είναι ότι τα PSR-9 (Security Advisories) και PSR-10 (Security Reporting Process) εγκαταλείφθηκαν. Κοινό πρότυπο για αναφορές ασφαλείας δεν υπάρχει επομένως· κάθε έργο το ρυθμίζει μόνο του. Πώς αντιμετωπίζει το ίδιο το έργο PHP τις ευπάθειες, περιγράφει η σελίδα Πώς το έργο PHP χειρίζεται τις ευπάθειες ασφαλείας.
Απέναντι στο PHP2Shell τα πρότυπα δεν βοηθούν: οι ευπάθειες CVE-2026-109618 και CVE-2026-109619 βρίσκονται στον διερμηνέα. Υποχρεωτικές είναι η ενημέρωση στην PHP 8.5.12, 8.4.27, 8.3.36 ή 8.2.35 και η επανεκκίνηση όλων των διεργασιών PHP.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Ελέγχουμε πώς καταγράφει η εφαρμογή σας και διασφαλίζουμε ότι τα exceptions καταλήγουν στο log, αλλά όχι διαπιστευτήρια ή αναγνωριστικά συνεδρίας.
- Αξιολογούμε πώς υλοποιείται η επεξεργασία μεταφορτώσεων και HTTP, ακόμη και όταν διέρχεται από βιβλιοθήκες PSR-7.
- Εξετάζουμε τις εσωτερικά ανεπτυγμένες λύσεις στο πλαίσιο ενός ελέγχου ασφαλείας και δοκιμής διείσδυσης.
- Εγκαθιστούμε ενημερώσεις PHP, επανεκκινούμε όλους τους workers και τεκμηριώνουμε την κατάσταση.
Συχνές ερωτήσεις
Τι σημαίνει PSR;
Το PSR σημαίνει PHP Standards Recommendation. Οι συστάσεις επεξεργάζονται και εγκρίνονται από το PHP-FIG, την PHP Framework Interop Group. Είναι προαιρετικές, εφαρμόζονται όμως από πολλά frameworks και βιβλιοθήκες.
Ισχύει ακόμη το PSR-12;
Το PSR-12 παραμένει στο PHP-FIG καταχωρισμένο ως αποδεκτό. Το PHP-FIG δημοσίευσε όμως με το PER Coding Style μια διάδοχη λύση, η οποία σύμφωνα με τη δική του δήλωση επεκτείνει και αντικαθιστά το PSR-12. Τρέχουσα εκεί είναι η έκδοση 3.1.
Υπάρχει PSR για αναφορές ασφαλείας;
Υπήρξαν δύο προτάσεις, το PSR-9 για τα Security Advisories και το PSR-10 για τη διαδικασία αναφοράς ευπαθειών. Και οι δύο είναι καταχωρισμένες στο PHP-FIG ως εγκαταλελειμμένες. Τα έργα ρυθμίζουν επομένως μόνα τους τη διαδικασία αναφοράς.
Πρέπει το έργο μου να τηρεί τα PSR;
Όχι, δεν υπάρχει υποχρέωση. Το PSR-4 για το autoloading και οι διεπαφές όπως τα PSR-3 ή PSR-7 διευκολύνουν όμως σημαντικά τη χρήση ξένων πακέτων και την αλλαγή παρόχων.