Strenge CSP erlaubt kein Unsafe Eval
Inhaltsverzeichnis
Was bedeutet das
Content Security Policy (CSP) ist eine Sicherheitsrichtlinie, die Browser anweist, welche Arten von Code auf einer Webseite ausgeführt werden dürfen. Die Direktive unsafe-eval steuert speziell, ob JavaScript zur Laufzeit dynamisch erzeugt und ausgeführt werden darf, etwa über eval() oder den Function()-Konstruktor. Eine strenge CSP, die unsafe-eval nicht erlaubt, blockiert genau diese Art der dynamischen Codeausführung im Browser. Das betrifft nicht nur eigenen Code der Webseite, sondern auch externe Tools, die zur Laufzeit Inhalte nachladen und ausführen, wie es bei client-seitigen A/B-Testing-Tools der Fall ist.
Funktioniert die Erstellung und Auslieferung auch ohne unsafe-eval
Nein, die Erstellung und Auslieferung von Experimenten funktioniert technisch nicht ohne unsafe-eval. Der Grund liegt in der Funktionsweise des Snippets selbst: Experimente werden nicht statisch beim Deployment der Seite eingebaut, sondern als Konfiguration zur Laufzeit vom Snippet abgerufen und im Browser durch eine JS-Engine angewendet. Genau das ermöglicht es, ein Experiment im Dashboard zu erstellen oder zu bearbeiten, ohne dass ein neues Deployment auf Kundenseite nötig ist.
Eine CSP kann jedoch nur Code erlauben, den sie im Voraus kennt, über eine feste Quelle, einen Hash oder einen Nonce. Keines dieser Verfahren funktioniert für Inhalte, die erst nach dem Laden der Seite zusammengesetzt werden. Damit der Browser diesen Code trotzdem ausführen kann, braucht es eval() oder den Function()-Konstruktor, also genau das, was unsafe-eval steuert. Da Targeting-Logik und Content-Änderungen über dieselbe Engine laufen, gibt es keinen separaten, „sicheren“ Ausführungspfad, den man nur für einfache Experimente (Text, CSS, Bilder) freischalten könnte.
Mögliche Lösung
Statt unsafe-eval sitegweit zu erlauben, kann die CSP pro Route unterschiedlich konfiguriert werden. Seiten mit besonders strengen Anforderungen (z. B. Login- oder Authentifizierungsflows) bleiben strikt und eval-frei, während unsafe-eval nur auf den Seiten erlaubt wird, auf denen tatsächlich Experimente laufen sollen.