CSP — Content Security Policy
HTTP header που περιορίζει ποιες πηγές μπορεί να φορτώσει μια σελίδα (μέτρο κατά XSS).
Τι είναι το CSP
Το CSP (Content Security Policy) είναι ένα HTTP response header που λέει στον browser ποιες πηγές επιτρέπεται να φορτώνει η σελίδα σου: scripts, στυλ, εικόνες, fonts, frames κλπ. Είναι το πιο ισχυρό browser-level μέτρο κατά XSS (cross-site scripting) και κατά data exfiltration.
Χωρίς CSP, μια ευπάθεια XSS μπορεί να φορτώσει malicious JavaScript από οποιοδήποτε domain του Διαδικτύου. Με CSP, ακόμη κι αν περάσει η ευπάθεια, ο browser αρνείται να εκτελέσει τον κώδικα γιατί δεν προέρχεται από εγκεκριμένη πηγή.
Βασικές directives
default-src— fallback για όλους τους τύπους πόρωνscript-src— από πού επιτρέπεται JavaScriptstyle-src— από πού επιτρέπεται CSSimg-src— εικόνεςconnect-src— XHR, fetch, WebSocketfont-src— fontsframe-src— iframesreport-uri— που να στέλνει αναφορές παραβιάσεων
Παράδειγμα CSP header
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; font-src 'self' https://fonts.gstatic.com; report-uri /csp-report
Σημαίνει:
- Εξ ορισμού, όλα τα assets πρέπει να έρχονται από το ίδιο domain
- Scripts: επιτρέπεται και το
cdn.example.com - Εικόνες: από οπουδήποτε με HTTPS και data URIs
- CSS: από ίδιο domain και inline styles (μη ιδανικό)
- Fonts: από Google Fonts
- Αναφορές παραβιάσεων σε
/csp-report
Strict CSP — η σύγχρονη προσέγγιση
Σήμερα συνιστάται «strict CSP» που χρησιμοποιεί nonce ή hash για να
εγκρίνει συγκεκριμένα inline scripts, αντί για allowlist domains:
Content-Security-Policy: script-src 'nonce-r4nd0m' 'strict-dynamic'; object-src 'none'; base-uri 'none';
Κάθε inline <script> tag πρέπει να έχει nonce="r4nd0m" (που γενιέται
φρέσκο σε κάθε request). Επιτιθέμενοι δεν μπορούν να μαντέψουν το nonce, οπότε injection
μπλοκάρεται.
Roll-out σε βήματα
- Ξεκίνα με
Content-Security-Policy-Report-Only— μόνο αναφορές, δε μπλοκάρει. - Συλλέγεις αναφορές, βλέπεις τι «θα έσπαζε».
- Διορθώνεις legitimate πηγές που λείπουν.
- Μετά από 1-2 εβδομάδες, ενεργοποιείς το πλήρες
Content-Security-Policy.