Ένα αντίγραφο ασφαλείας στον ριζικό κατάλογο είναι διαρροή κώδικα
Πριν επεξεργαστεί κανείς ένα μεγάλο αρχείο, η φυσική κίνηση είναι να το αντιγράψει πρώτα. cp index.php index.php.vor-aenderung, και μετά στη δουλειά. Αν αυτό το αρχείο βρίσκεται στον κατάλογο που δημοσιεύει ο διακομιστής web, ολόκληρος ο πηγαίος κώδικας μόλις έγινε διαθέσιμος για λήψη ως απλό κείμενο — στοιχεία πρόσβασης στη βάση δεδομένων, μυστικά, ό,τι τυχαίνει να περιέχει το αρχείο.
Ο Apache εκτελεί το index.php μέσω PHP επειδή τελειώνει σε .php. Το index.php.vor-aenderung δεν τελειώνει σε .php. Τελειώνει σε .vor-aenderung, κάτι που ο Apache δεν έχει ακούσει ποτέ, οπότε κάνει το προεπιλεγμένο: στέλνει τα byte.
Ο κανόνας που γράφουν οι περισσότεροι, και γιατί δεν αρκεί
Η συνήθης προστασία είναι μια λίστα απαγορευμένων επεκτάσεων: .bak, .orig, .save, .sql, .old. Πιάνει το αρχείο που ήρθε στο μυαλό. Σε δοκιμή εδώ, αυτή η λίστα έδωσε τη σωστή απάντηση για το probe.bak και τη λάθος απάντηση για καθένα από τα εξής:
index.php.vor-xyz— έτσι ακριβώς συνέβηindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Όλα σερβιρίστηκαν με 200. Το μοτίβο ονομασίας που δεν σκέφτηκε κανείς είναι αυτό που τελικά χρησιμοποιείται, γιατί τα αντίγραφα ασφαλείας παίρνουν το όνομά τους από ό,τι συνέβαινε εκείνη τη στιγμή.
Αντιστροφή της λογικής
Ο κανόνας που λειτουργεί δεν ρωτά ποιες επεκτάσεις απαγορεύονται. Κάνει μια δομική ερώτηση: περιέχει αυτό το όνομα αρχείου μια επέκταση πηγαίου κώδικα που δεν βρίσκεται στο τέλος;
Αν ναι, είναι αντίγραφο κάποιου αρχείου που προοριζόταν να εκτελεστεί, ό,τι κι αν λέει η κατάληξη που ακολουθεί. index.php.anything ταιριάζει. style.css.anything ταιριάζει. Το μοτίβο καλύπτει και τα ονόματα που δεν έχει επινοήσει ακόμη κανείς, και αυτό ακριβώς είναι το ζητούμενο.
Σε έλεγχο στον πραγματικό διακομιστή σήμερα, και τα πέντε παραπάνω ονόματα επιστρέφουν πλέον 403, ακόμη και όσα δεν υπάρχουν — ο κανόνας απορρίπτει το σχήμα, όχι το αρχείο.
Η εξαίρεση και τι διδάσκει
Ένα νόμιμο όνομα αρχείου εδώ έχει ακριβώς αυτό το σχήμα: τα προσυμπιεσμένα αρχεία γράφονται ως style.css.1787777226.gz, με επέκταση στη μέση εκ σχεδιασμού. Γι’ αυτό ο κανόνας έχει μία μόνο, στενή εξαίρεση για ένα αριθμητικό τμήμα ακολουθούμενο από .gz, και αυτό το αρχείο επιστρέφει 200 όπως πρέπει.
Μια τέτοια εξαίρεση είναι το σημείο όπου συνήθως αποτυγχάνουν αυτοί οι κανόνες, οπότε αξίζει να πούμε τι την κάνει ασφαλή: είναι αρκετά στενή ώστε να μην μπορεί να κατασκευαστεί κανένα όνομα της μορφής index.php.something.gz που να επιστρέφει τον πηγαίο κώδικα, επειδή το μεσαίο τμήμα πρέπει να αποτελείται μόνο από ψηφία. Μια ευρύτερη εξαίρεση — «οτιδήποτε τελειώνει σε .gz» — θα είχε ακυρώσει ολόκληρο τον κανόνα.
Και η απλούστερη συμβουλή παραμένει αυτή που κάνει όλα τα παραπάνω περιττά: κρατήστε τα αντίγραφα ασφαλείας έξω από τον δημοσιευμένο κατάλογο. Ο κανόνας είναι ένα δίχτυ ασφαλείας για τη μέρα που αυτό θα ξεχαστεί, όχι άδεια να μη σας νοιάζει πού καταλήγει το αντίγραφο.