CSP/Trusted Types — Content Security Policy Enforcement + Trusted Types API #103
Labels
No labels
bug
docs
feature
housekeeping
html-spec
performance
react-compat
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
glow-all/true-headless-browser#103
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Titel: CSP/Trusted Types — Content Security Policy Enforcement + Trusted Types API
Problembeschreibung
Content Security Policy (CSP) wird aktuell überhaupt nicht unterstützt:
<meta http-equiv="Content-Security-Policy">oder HTTP-Response-HeaderntrustedTypes.createPolicy()) fehlt komplettWarum das blockiert:
Betroffene Sites:
default-src 'none'→ blockiert alle Resourcen ohne korrektes EnforcingArchitektur
CSP-Parser (csp-parser.ts)
Parst sowohl
Content-Security-PolicyHTTP-Header als auch<meta http-equiv>:CSP-Enforcer (csp-enforcer.ts)
Wird in ScriptLoader + StyleEngine eingehängt:
Trusted Types (trusted-types.ts)
Optionen
Option A: CSP Level 2 + Basis-TrustedTypes (Empfohlen)
CSP Level 2 Direktiven + Trusted Types nach Chrome 134 Spec:
default-src,script-src,style-src,img-src,connect-src,font-src,frame-src,media-src,object-srcreport-uri+report-to(vereinfacht)nonce+hashfür inline-Scriptsscript-src-elem,style-src-attr, etc.) — späterVorteile: Deckt 90% der Sites ab, implementierbar in 4 Tagen
Nachteile: Level 3 fehlt (selten benötigt)
Option B: CSP Level 3 + Full TrustedTypes
Alles aus Option A plus:
script-src-elem,script-src-attr,style-src-elem,style-src-attrstrict-dynamicPropagationwasm-unsafe-evalreport-tovia ReportingObservertrusted-typesdirective (CSP sagt welche Policies erlaubt sind)require-trusted-types-for 'script'Vorteile: 100% Spec-konform
Nachteile: Doppelter Aufwand, selten benötigt
→ Option A gewinnt (Level 2 + Basis-TT)
Akzeptanzkriterien (25 Punkte)
Phase 1: CSP-Parser — 8 Punkte
<meta http-equiv="Content-Security-Policy" content="...">Content-Security-PolicyContent-Security-Policy-Report-Only(nur report, kein block)default-src 'self'→ directive=single sourcescript-src 'self' 'unsafe-inline' https://*.example.com→ multiple sourcesimg-src 'self' data: blob:→ scheme-sourcesscript-src 'nonce-abc123'→ nonce extrahiertscript-src 'sha256-xyz...'→ hash extrahiert (sha256/sha384/sha512)Phase 2: CSP-Enforcer — 8 Punkte
script-src 'self'→ blockiert Script von fremdem Originscript-src 'unsafe-inline'→ erlaubt inline Scripts (script-Tag)script-src 'unsafe-eval'→ erlaubt eval()script-src 'nonce-abc'→ erlaubt Script mit nonce="abc"script-src 'sha256-xyz'→ erlaubt Script mit Hash xyzdefault-src 'none'→ blockiert ALLE Resourcen (außer erlaubte)style-src 'self'→ blockiert inline Stylesimg-src 'self'→ blockiert externe BilderPhase 3: Trusted Types — 6 Punkte
trustedTypes.createPolicy("default", { createHTML: (s) => s })→ PolicytrustedTypes.isHTML(value)→ booleantrustedTypes.isScript(value)→ booleantrustedTypes.isScriptURL(value)→ booleantrustedTypes.getPropertyType("div", "innerHTML")→ "TrustedHTML"TrustedHTMList ein opaque Wrapper (kein Zugriff auf _value von außen)Phase 4: Violation Events — 3 Punkte
SecurityPolicyViolationEventbei Script-Blockadedocument.securityPolicyViolationEventwird dispatched (auf document)Abhängigkeiten
Risiken
require-trusted-types-fordeaktiviert lassenPerformance-Impact
Gesamt-Overhead: < 0.1ms pro Resource-Check — vernachlässigbar.
Betroffene Dateien
src/security/csp-parser.tssrc/security/csp-enforcer.tssrc/security/trusted-types.tssrc/security/violation-event.tssrc/security/csp-directives.tssrc/security/index.tssrc/js/script-loader.tssrc/js/execution-realm.tssrc/css/style-engine.tssrc/runtime-isolation.tssrc/pages/page.tstests/unit/csp-parser.test.tstests/unit/csp-enforcer.test.tstests/unit/trusted-types.test.tstests/unit/violation-event.test.tsTestplan (60 Tests)
Unit-Tests
csp-parser: 15 Tests
default-src 'self'→ korrekte Directivescript-src 'self' 'unsafe-inline' 'unsafe-eval'→ 3 Sourcesimg-src 'self' data: blob:→ scheme-sourcesscript-src 'nonce-abc123'→ nonce extrahiertscript-src 'sha256-abc...'→ hash extrahiertreport-uri /csp-report→ reportUri extrahiertconnect-src https://api.example.com→ host-sourcefont-src 'self' https://fonts.gstatic.com→ multi-sourceDefault-Src→ default-srccsp-enforcer: 20 Tests
default-src 'none'→ alles blockiertscript-src 'self'→ same-origin Script erlaubt, cross-origin blockiertscript-src 'unsafe-inline'→ inline Script erlaubtunsafe-inline→ inline Script blockiertscript-src 'unsafe-eval'→ eval() erlaubtunsafe-eval'→ eval() blockiertscript-src 'nonce-abc'→ Script mit nonce="abc" erlaubtscript-src 'sha256-xyz'→ Script mit Hash xyz erlaubtstyle-src 'self'→ inline Style blockiertstyle-src 'unsafe-inline'→ inline Style erlaubtimg-src 'self'→ externes Bild blockiertconnect-src 'self'→ fetch zu externem Host blockiertdefault-src 'self'+img-src 'self' https://images.com→ overridefont-src 'self'→ Google Fonts blockiertframe-src 'none'→ iframe blockiertmedia-src 'self'→ externes Video blockiertobject-src 'none'→ object/embed blockierttrusted-types: 15 Tests
createPolicy("default", { createHTML: (s) => s })→ PolicyisHTML(TrustedHTML)→ trueisHTML(string)→ falseisScript(TrustedScript)→ trueisScriptURL(TrustedScriptURL)→ truegetPropertyType("div", "innerHTML")→ "TrustedHTML"getPropertyType("script", "src")→ "TrustedScriptURL"getPropertyType("div", "title")→ null (kein Trusted Type)emptyHTML→ TrustedHTML mit "" (leerer String)emptyScript→ TrustedScript mit ""violation-event: 10 Tests
Integration-Tests (10)
Zeitplan
Gesamtschätzung: 5-6 Tage
Deployment-Hinweise
require-trusted-types-for— standardmäßig deaktiviertstrictMode: wirft MissingBrowserAPI-like Error (dev)productionMode: nur loggen, nicht blockieren (scrape)