CSP říká prohlížeči, odkud smí načítat skripty, styly, obrázky a další zdroje. Správně nastavený CSP zastaví většinu XSS útoků, protože i když útočník injektuje škodlivý skript do stránky, prohlížeč ho odmítne spustit, pokud neodpovídá politice. CSP je nejúčinnější obrana proti XSS po sanitizaci vstupu — a na rozdíl od sanitizace funguje i proti zero-day zranitelnostem.
Základní CSP¶
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-abc123';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
Každá direktiva definuje povolené zdroje pro konkrétní typ obsahu. default-src 'self' povolí pouze zdroje z vlastní domény. script-src s nonce umožňuje spouštět jen skripty s odpovídajícím nonce atributem. frame-ancestors 'none' zabraňuje vložení stránky do iframe (ochrana proti clickjacking).
Nonce-based CSP¶
import secrets
@app.after_request
def add_csp(response):
nonce = secrets.token_urlsafe(32)
response.headers['Content-Security-Policy'] = f"script-src 'self' 'nonce-{nonce}'"
return response
Nonce (number used once) je náhodná hodnota generovaná pro každý request. Každý legitimní <script> tag dostane atribut nonce="abc123" a CSP povolí jen skripty s odpovídajícím nonce. Injektovaný skript bez správného nonce se nespustí. Nonce je bezpečnější než hash-based přístup, protože nevyžaduje předem znát obsah skriptu.
Postupné nasazení¶
- Report-Only s permisivní politikou — zjistíte, co by CSP blokoval
- Analyzujte reporty — identifikujte legitimní zdroje a inline skripty
- Zpřísněte politiku — odstraňte nepotřebné zdroje
- Přepněte na enforcement — CSP začne blokovat
- Monitorujte reporty — odhalte nové zdroje a potenciální útoky
Nasazení CSP bez Report-Only fáze typicky rozbije aplikaci. Reporting endpoint (report-uri nebo report-to) sbírá informace o blokovaných zdrojích a umožňuje iterativně zpřísňovat politiku.
Klíčový takeaway¶
CSP je nejúčinnější obrana proti XSS. Začněte s Report-Only, postupně zpřísňujte a monitorujte reporty. Nonce-based CSP je doporučený přístup pro moderní aplikace.