Εν συντομία: Η στατική ανάλυση ελέγχει τον κώδικα PHP χωρίς να τον εκτελεί και βρίσκει έτσι σφάλματα τύπων, μη ορισμένες μεταβλητές, νεκρό κώδικα και κλήσεις σε τιμές που ενδεχομένως είναι κενές. Τα δύο διαδεδομένα εργαλεία είναι το PHPStan (επίπεδα κανόνων 0 έως 10) και το Psalm (επίπεδα σφαλμάτων 1 έως 8, και επιπλέον μια ανάλυση taint για ανασφαλείς ροές δεδομένων). Βρίσκουν σφάλματα στην εφαρμογή σας, όχι στον διερμηνέα της PHP· απέναντι σε ευπάθειες όπως το PHP2Shell βοηθά μόνο η ενημέρωση της PHP.
Τι είναι η στατική ανάλυση;
Μια δοκιμή εκτελεί κώδικα και συγκρίνει το αποτέλεσμα. Η στατική ανάλυση διαβάζει αντίθετα τον κώδικα σαν ένας πολύ προσεκτικός ελεγκτής και συμπεραίνει από τύπους, τιμές επιστροφής και κλήσεις πού μπορεί να πάει κάτι στραβά. Βρίσκει σφάλματα ακόμη και σε κλάδους που καμία δοκιμή δεν φτάνει ποτέ.
Για όσους αποφασίζουν το όφελος είναι απλό: τα σφάλματα που βρίσκονται πριν από την παραγωγή κοστίζουν ένα κλάσμα εκείνων που αντιλαμβάνονται οι πελάτες. Για τους προγραμματιστές είναι ένας διαρκής σύντροφος που εκτελείται στο περιβάλλον ανάπτυξης και στο pipeline CI. Αν η ανάλυση ειδοποιήσει σε μια αλλαγή, η αλλαγή δεν γίνεται δεκτή μέχρι να διορθωθεί το σφάλμα. Έτσι δεν δημιουργείται νέο παλιό χρέος, ενώ το υπάρχον αποσβένεται σταδιακά. Μαζί με τις δοκιμές με PHPUnit και Pest αποτελεί το θεμέλιο της ποιότητας κώδικα.
PHPStan: επίπεδα κανόνων από το 0 έως το 10
Το PHPStan εγκαθίσταται ως εξάρτηση ανάπτυξης και χρειάζεται για να εκτελεστεί PHP από την 7.4:
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src tests
Χωρίς περαιτέρω δήλωση, το PHPStan ελέγχει μόνο τα απολύτως απαραίτητα. Την αυστηρότητα ελέγχετε μέσω έντεκα επιπέδων, κάθε ένα περιλαμβάνει τα χαμηλότερα:
| Επίπεδο | Τι ελέγχεται επιπλέον (επιλογή) |
|---|---|
| 0 | άγνωστες κλάσεις και συναρτήσεις, λάθος αριθμός ορισμάτων, πάντα μη ορισμένες μεταβλητές |
| 3 | τύποι επιστροφής και τύποι που ανατίθενται σε ιδιότητες |
| 5 | τύποι των ορισμάτων σε κλήσεις συναρτήσεων και μεθόδων |
| 6 | τύποι που λείπουν |
| 8 | κλήσεις μεθόδων και προσπελάσεις ιδιοτήτων σε τιμές που μπορεί να είναι null |
| 10 | αυστηρότερος χειρισμός του mixed, ακόμη και σε τύπους που λείπουν |
Με το --level max εκτελείται πάντα το υψηλότερο επίπεδο. Η τεκμηρίωση προειδοποιεί ωστόσο ότι μια αναβάθμιση του PHPStan μπορεί τότε να φέρει πολλά νέα μηνύματα. Ένα τυπικό εύρημα από το επίπεδο 8:
<?php
function kundenname(?Kunde $kunde): string
{
return $kunde->name(); // PHPStan: κλήση σε τιμή που μπορεί να είναι null
}
Εισαγωγή του PHPStan χωρίς πλημμύρα σφαλμάτων: το baseline
Σε έργα που έχουν μεγαλώσει με τα χρόνια, το PHPStan σε υψηλό επίπεδο αναφέρει συχνά εκατοντάδες σημεία. Το baseline λύνει το πρόβλημα: αποθηκεύει όλα τα υπάρχοντα μηνύματα σε ένα αρχείο και το PHPStan αναφέρει στη συνέχεια μόνο νέα σφάλματα.
vendor/bin/phpstan analyse --level 6 src tests --generate-baseline
Το αρχείο phpstan-baseline.neon που δημιουργείται το συμπεριλαμβάνετε στη διαμόρφωση:
includes:
- phpstan-baseline.neon
parameters:
level: 6
paths:
- src
- tests
Έτσι το παλιό υλικό παραμένει ορατά τεκμηριωμένο, ενώ ο νέος κώδικας πρέπει να είναι καθαρός από την αρχή.
Psalm και η ανάλυση taint
Το Psalm επιδιώκει παρόμοιους στόχους με το PHPStan. Τα επίπεδα τρέχουν αντίστροφα: το 1 είναι το αυστηρότερο, το 8 το πιο επιεικές, προεπιλογή είναι το 2. Το Psalm χρειάζεται PHP από την 8.2 και στήνεται ως εξής:
composer require --dev vimeo/psalm
./vendor/bin/psalm --init
./vendor/bin/psalm --taint-analysis
Η ανάλυση taint είναι ιδιαίτερα ενδιαφέρουσα για την ασφάλεια. Το «taint» σημαίνει μόλυνση: το Psalm σημαδεύει δεδομένα από πηγές που μπορεί να ελέγχει ένας επιτιθέμενος, όπως τα $_GET, $_POST, $_COOKIE, $_REQUEST ή το php://input. Στη συνέχεια παρακολουθεί αν αυτά τα δεδομένα φτάνουν απροστάτευτα σε επικίνδυνα σημεία, τους λεγόμενους προορισμούς (sinks): έξοδος με echo, include, header ή ερωτήματα SQL. Στις ενσωματωμένες κατηγορίες ανήκουν μεταξύ άλλων οι sql, html, shell, include, eval, ssrf και unserialize.
<?php
// Το Psalm αναφέρει ροή από το $_GET στην έξοδο HTML (κατηγορία html)
echo 'Hallo ' . $_GET['name'];
// Διορθώθηκε: μασκάρισμα της εξόδου ανάλογα με το περιβάλλον
echo 'Hallo ' . htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');
Η τεκμηρίωση του Psalm αναφέρει ανοιχτά τα όρια: η ανάλυση υποθέτει ότι το μασκάρισμα γίνεται σωστά. Λεπτά σφάλματα, για παράδειγμα ελλείποντα εισαγωγικά γύρω από ένα χαρακτηριστικό HTML, μπορούν παρ' όλα αυτά να αφήσουν κενά. Το Psalm συνιστά γι' αυτό παραμετροποιημένα ερωτήματα για SQL και templates με επίγνωση του περιβάλλοντος για HTML. Τα αποτελέσματα μπορούν να εξαχθούν σε μορφή SARIF, την οποία κατανοεί μεταξύ άλλων το GitHub Code Scanning.
Στατική ανάλυση και ασφάλεια μετά το PHP2Shell
Εδώ αξίζει ένας ειλικρινής διαχωρισμός. Το PHP2Shell, δηλαδή οι CVE-2026-109618 και CVE-2026-109619, βρίσκεται στον διερμηνέα της PHP. Κανένα εργαλείο που διαβάζει τον κώδικα της εφαρμογής σας δεν βρίσκει αυτές τις ευπάθειες και καμία αλλαγή κώδικα δεν τις κλείνει. Αυτό το επιτυγχάνει μόνο η ενημέρωση στην PHP 8.5.12, 8.4.27, 8.3.36 ή 8.2.35.
Παρ' όλα αυτά η στατική ανάλυση συμβάλλει στην ασφάλεια, σε τρία σημεία:
- Ικανότητα αναβάθμισης: Βρίσκει κώδικα που δεν εκτελείται πλέον σε νέες εκδόσεις PHP. Έτσι μειώνεται το εμπόδιο για τη μετάβαση από την 8.1 ή 8.2 σε υποστηριζόμενη έκδοση.
- Δικές σας ευπάθειες: Η ανάλυση taint βρίσκει διαδρομές για SQL injection, cross-site scripting ή συμπερίληψη αρχείων. Το έργο PHP διευκρινίζει στην πολιτική ασφαλείας του ότι ανέλεγκτες είσοδοι σε συναρτήσεις όπως η
mysqli_query()δεν αποτελούν σφάλμα της PHP, αλλά ευθύνη της εφαρμογής. - Στιβαρότητα: Πολλά μοιραία σφάλματα προκύπτουν από κλήσεις σε null ή λάθος τύπους. Το php.net συμβουλεύει στο πλαίσιο της CVE-2026-109619 ρητά να διορθώνονται στην εφαρμογή τα μοιραία σφάλματα που μπορούν να προκληθούν από έξω.
Η στατική ανάλυση δεν αντικαθιστά τον έλεγχο κώδικα ασφαλείας από ανθρώπους, τον κάνει όμως αποδοτικότερο, επειδή τα σφάλματα ρουτίνας έχουν ήδη αφαιρεθεί.
Πώς βοηθά συγκεκριμένα η PHP SOS;
Στο πλαίσιο του ελέγχου ασφαλείας και της δοκιμής διείσδυσης ακολουθούμε την εξής πορεία:
- Εγκατάσταση εργαλείων: PHPStan ή Psalm με κατάλληλο επίπεδο και baseline, ενσωματωμένα στο υπάρχον pipeline σας.
- Αξιολόγηση ευρημάτων ασφαλείας: Ελέγχουμε τα αποτελέσματα της ανάλυσης taint και διαχωρίζουμε πραγματικούς κινδύνους από ψευδείς συναγερμούς.
- Προετοιμασία αναβάθμισης: Δείχνουμε ποια σημεία εμποδίζουν τη μετάβαση σε υποστηριζόμενη έκδοση PHP.
- Παράδοση αποτελεσμάτων: Λαμβάνετε μια κατά προτεραιότητα λίστα με συγκεκριμένα σημεία κώδικα για την ομάδα ή το πρακτορείο σας.
Συχνές ερωτήσεις
Ποια είναι η διαφορά μεταξύ PHPStan και Psalm;
Και τα δύο ελέγχουν τύπους και βρίσκουν σφάλματα χωρίς εκτέλεση. Το PHPStan αριθμεί τα επίπεδά του από το 0 (χαλαρό) έως το 10 (αυστηρό), το Psalm από το 8 (χαλαρό) έως το 1 (αυστηρό). Το Psalm συνοδεύεται από ενσωματωμένη ανάλυση taint για προβλήματα ασφαλείας.
Μπορώ να εισαγάγω το PHPStan σε ένα παλιό έργο;
Ναι. Με ένα baseline το PHPStan αποθηκεύει όλα τα υπάρχοντα μηνύματα σε ένα αρχείο και στη συνέχεια αναφέρει μόνο νέα σφάλματα. Έτσι η ομάδα ξεκινά χωρίς πλημμύρα σφαλμάτων και αποσβένει σταδιακά το παλιό χρέος.
Βρίσκει η στατική ανάλυση το PHP2Shell;
Όχι. Το PHP2Shell βρίσκεται στον διερμηνέα της PHP, όχι στον κώδικά σας. Εναντίον του βοηθά μόνο η ενημέρωση της PHP. Η στατική ανάλυση βοηθά όμως να προετοιμαστεί ο κώδικας για νέες εκδόσεις PHP, ώστε η ενημέρωση να γίνεται ταχύτερα.
Ποιο επίπεδο πρέπει να επιλέξει κανείς;
Για την αρχή ένα χαμηλό επίπεδο χωρίς baseline ή ένα υψηλότερο επίπεδο με baseline. Σημαντικότερο από τον αριθμό είναι η ανάλυση να εκτελείται αυτόματα σε κάθε αλλαγή και να μην αφήνει νέα σφάλματα να περάσουν.