Γεννήτρια CSP — Πολιτική ασφάλειας περιεχομένου, με τα επικίνδυνα σημεία επισημασμένα
Γεννήτρια CSP
Επιλογή των οδηγιών και των πηγών, και αυτή η σελίδα συναρμολογεί μία ορθή Content-Security-Policy μίας γραμμής για την κεφαλίδα απόκρισης ή την ετικέτα <meta> — μαζί με τις σημειώσεις που έχουν σημασία: ποιες οδηγίες δεν επιστρέφουν ποτέ στο default-src, πότε ένα hash ή nonce υπερισχύει σιωπηλά του unsafe-inline, και τι απενεργοποιεί το strict-dynamic. Μια ενσωματωμένη γεννήτρια hash SHA-256/384/512 μετατρέπει τα inline scripts και styles σε πηγές 'sha256-…'. Όλα εκτελούνται στο πρόγραμμα περιήγησης· τίποτα δεν μεταφορτώνεται.
Οδηγίες fetch — από πού μπορεί να προέρχεται το περιεχόμενο
Οι μη επιλεγμένες οδηγίες απλώς απουσιάζουν από την πολιτική· ένα τικ χωρίς επιλεγμένες πηγές αγνοείται. Το 'none' ακυρώνει τα άλλα πλαίσια της γραμμής του. Το πλαίσιο πρόσθετες πηγές δέχεται λίστα διαχωρισμένη με κόμματα: ονόματα κεντρικών υπολογιστών (cdn.example.com), σχήματα (https:), hash και nonce με ή χωρίς εισαγωγικά.
οδηγία
'self'
'none'
'unsafe-inline'
'unsafe-eval'
'strict-dynamic'
data:
blob:
πρόσθετες πηγές
Οδηγίες εγγράφου — τι μπορεί να κάνει η ίδια η σελίδα
Αυτά τα τέσσερα δεν επιστρέφουν στο default-src: αν παραλείπονται, σημαίνει «χωρίς περιορισμό»· γι' αυτό μια πλήρης πολιτική τα ορίζει ρητά.
οδηγία
'self'
'none'
πρόσθετες πηγές
Διακόπτες, nonce και αναφορά
nonce σεναρίου
report-uri
report-to
Πολιτική
Δεν έχει κατασκευαστεί ακόμη τίποτα. Επιλογή μερικών πηγών και πάτημα του Κατασκευή πολιτικής, ή φόρτωση του δείγματος βάσης OWASP.
Γεννήτρια hash για inline σενάρια και στυλ
Επικόλληση του ακριβούς περιεχομένου ανάμεσα στο <script> και στο </script> (ή στο μπλοκ style) — byte προς byte, χωρίς αλλαγή γραμμής στην αρχή ή στο τέλος — και επιλογή αλγορίθμου. Το αποτέλεσμα είναι η πηγή 'sha256-…' που αναμένει η CSP 3.
Η έξοδος του hash εμφανίζεται εδώ.
Ανάπτυξη ως κεφαλίδα, όχι ως ετικέτα meta, όποτε είναι δυνατό. Η κεφαλίδα απόκρισης είναι η πλήρης CSP: τα frame-ancestors, report-uri και report-to λειτουργούν μόνο εκεί, και η κεφαλίδα εφαρμόζεται πριν από το πρώτο byte του HTML. Η ετικέτα meta είναι η εφεδρεία για στατικά αρχεία χωρίς ρύθμιση διακομιστή. Ο έλεγχος των κεφαλίδων που στέλνει πράγματι ο ιστότοπος γίνεται στον έλεγχο κεφαλίδων ασφαλείας, και τα ακατέργαστα μπλοκ απόκρισης αναλύονται στον αναλυτή κεφαλίδων HTTP.
Αυτοέλεγχος Εκ νέου εκτέλεση του κατασκευαστή σε σταθερές καταστάσεις: σειρά πηγών, αμοιβαία αποκλειστικότητα του 'none', η συμβολοσειρά της βάσης OWASP, το εισαγωγικό των nonce και hash, οι σημειώσεις για την απουσία εφεδρείας των base-uri / form-action / frame-ancestors, το unsafe-inline που υπερισχύεται από nonce ή hash, οι σημειώσεις strict-dynamic, τα ονόματα κεφαλίδων Report-Only, οι εξαιρέσεις της ετικέτας meta, η γεννήτρια hash έναντι ανεξάρτητα υπολογισμένων διανυσμάτων SHA, και οι αρνητικές διαδρομές. Τίποτα δεν αποστέλλεται πουθενά.
Τι είναι η πολιτική ασφάλειας περιεχομένου;
Σε μία πρόταση: η CSP είναι λίστα επιτρεπόμενων που στέλνει ο διακομιστής με μια σελίδα και λέει στο πρόγραμμα περιήγησης ακριβώς από πού μπορούν να προέρχονται σενάρια, στυλ, εικόνες και συνδέσεις — ώστε ακόμη κι αν ένας επιτιθέμενος εισαγάγει HTML, το εισαγόμενο σενάριο δεν φορτώνεται, επειδή η πηγή του δεν βρίσκεται στη λίστα.
από πού μπορεί να φορτωθεί κάθε είδος περιεχομένου
ναι — μια μη επιλεγμένη οδηγία κληρονομεί το default-src
Οδηγίες εγγράφου
base-uri, form-action, frame-ancestors, sandbox
τι μπορεί να κάνει η ίδια η σελίδα (να ενσωματωθεί, να υποβάλει φόρμες, να επιλύσει σχετικά URL)
όχι — καθεμία πρέπει να οριστεί ρητά
Αναφορά και διάφορα
report-uri, report-to, upgrade-insecure-requests
πού στέλνονται οι αναφορές παραβιάσεων και η αναβάθμιση παλαιών URL
όχι (δεν είναι οδηγίες fetch)
Οι πιο αιχμηρές άκρες, μία παράγραφος η καθεμία
'unsafe-inline' έναντι hash και nonce. Αν μια οδηγία περιέχει nonce ή οποιαδήποτε πηγή hash, το CSP 3 λέει ότι το 'unsafe-inline'αγνοείται — παραμένει εκεί μόνο για πολύ παλιά προγράμματα περιήγησης. Γι' αυτό το «προσθέσαμε nonce και κρατήσαμε το unsafe-inline για ασφάλεια» σημαίνει ότι τα σύγχρονα προγράμματα περιήγησης επιβάλλουν το nonce. Η γεννήτρια επισημαίνει τον συνδυασμό ώστε να είναι απόφαση και όχι ατύχημα.
Το strict-dynamic απενεργοποιεί τη λίστα επιτρεπόμενων. Με το strict-dynamic στο script-src, οι πηγές κεντρικού υπολογιστή, τα σχήματα, το 'self', το 'unsafe-inline' και το data: αγνοούνται για τα σενάρια· έχουν σημασία μόνο τα nonce και τα hash, και τα σενάρια που φορτώνουν μπορούν να φορτώσουν περαιτέρω σενάρια. Είναι ο σύγχρονος τρόπος εκτέλεσης σεναρίων φόρτωσης — αλλά κάνει το υπόλοιπο της λίστας script-src διακοσμητικό.
Οι ετικέτες meta είναι δευτερευούσης κατηγορίας. Τα frame-ancestors, report-uri και report-to αγνοούνται στο <meta http-equiv>. Η γεννήτρια δείχνει ποια μέρη της πολιτικής δεν θα εφαρμοστούν σιωπηλά.
Συνηθισμένα λάθη
Ξεκινώντας με default-src * και μακρύ κατάλογο εξαιρέσεων. Ο αντίστροφος δρόμος: ένα αυστηρό default-src 'self', και στη συνέχεια διεύρυνση μόνο των οδηγιών που το χρειάζονται. Οι στενές πολιτικές αποτυγχάνουν δυνατά κατά τη δοκιμή· οι ευρείες αποτυγχάνουν σιωπηλά για πάντα.
Η αποστολή του script-src 'unsafe-inline' 'unsafe-eval' και το θεωρείται τελειωμένο. Μια τέτοια πολιτική σχεδόν δεν εμποδίζει τίποτα που θέλει να κάνει μια επίθεση XSS. Με nonce ή hash στα σενάρια, προσθήκη του strict-dynamic και διατήρηση του report-only σε παραγωγή για τον εντοπισμό παλινδρομήσεων.
Η λησμονιά ότι το default-src δεν καλύπτει τα πάντα. Τα base-uri, form-action, frame-ancestors και sandbox δεν έχουν εφεδρεία — το πιο συχνά αναφερόμενο κενό σε πραγματικές εγκαταστάσεις CSP.
Δοκιμή πρώτα σε λειτουργία επιβολής. Εκτέλεση σε Report-Only με συλλέκτη για μία εβδομάδα, ανάγνωση των αναφορών και μετά μετάβαση στην επιβολή. Μια πολιτική που σπάει το ταμείο είναι χειρότερη από καμία πολιτική.
Διαφορετικό hashing των κενών. Ένα hash καλύπτει τα ακριβή byte του inline μπλοκ· ένα «χρήσιμο» βήμα κατασκευής που κόβει τις τελικές αλλαγές γραμμής αλλάζει κάθε hash. Τα hash δημιουργούνται από αυτό που αποστέλλεται, όχι από τον πηγαίο κώδικα.
Συχνές ερωτήσεις
Χρειάζεται το default-src αν αναφέρονται όλες οι οδηγίες; Όχι, αλλά η διατήρησή του ως βάση είναι καλή πρακτική: οι νέες οδηγίες fetch σε μελλοντικά προγράμματα περιήγησης τότε προεπιλέγονται στη βάση του αντί για «επιτρέπεται».
Τι κάνει πραγματικά το upgrade-insecure-requests; Λέει στο πρόγραμμα περιήγησης να ξαναγράψει κάθε URL http:// που θα φόρτωνε η σελίδα — εικόνες, στυλ, fetch — σε https:// πριν από το αίτημα. Είναι εργαλείο μετάβασης· η τελική κατάσταση είναι σελίδες χωρίς κανένα URL http://.
Nonce ή hash; Nonce όταν ελέγχεται η απόκριση του διακομιστή (τυχαία τιμή ανά απόκριση, στην κεφαλίδα και σε κάθε ετικέτα script). Hash όταν το HTML είναι στατικό ή αποθηκευμένο στην κρυφή μνήμη. Ποτέ στατικό nonce — ένα nonce που δεν αλλάζει είναι απλώς unsafe-inline με περισσότερα βήματα.
Γιατί η πολιτική παραδίδεται αλλά οι παραβιάσεις δεν φτάνουν; Ελέγχεται αν η πολιτική βρίσκεται σε Report-Only (μόνο αναφορές), αν το report-uri δείχνει σε συλλέκτη που δέχεται POST, και αν έχει ρυθμιστεί και ο μηχανισμός Reporting-Endpoints / Report-To που απαιτεί η σύγχρονη οδηγία report-to.
Αντικαθιστά η CSP άλλες προστασίες; Όχι. Είναι ένα επίπεδο: διατηρείται η διαφυγή της εξόδου, τα cookies πίσω από HttpOnly και Secure, και το HSTS. Ο έλεγχος κεφαλίδων ασφαλείας αυτού του ιστότοπου βαθμολογεί ολόκληρο το σύνολο.