Strikte CSP erlaubt keine unsichere Auswertung
Was bedeutet das?
Content Security Policy (CSP) ist eine Sicherheitsrichtlinie, die Browsern vorgibt, welche Arten von Code auf einer Webseite ausgeführt werden dürfen. Die Direktive unsafe-eval steuert speziell, ob JavaScript zur Laufzeit dynamisch generiert und ausgeführt werden darf, zum Beispiel über eval() oder den Function()-Konstruktor. Eine strikte CSP, die unsafe-eval nicht erlaubt, blockiert genau diese Art der dynamischen Codeausführung im Browser. Das betrifft nicht nur den eigenen Code der Website, sondern auch externe Tools, die zur Laufzeit Inhalte nachladen und ausführen, wie es bei clientseitigen A/B-Testing-Tools der Fall ist.
Funktioniert die Erstellung und Auslieferung auch ohne unsafe-eval?
Nein, technisch gesehen ist die Erstellung und Auslieferung von Experimenten ohne unsafe-eval nicht möglich. Der Grund liegt in der Funktionsweise des Snippets selbst: Experimente werden beim Deployment der Seite nicht statisch eingebettet, sondern vom Snippet zur Laufzeit als Konfiguration abgerufen und im Browser von einer JavaScript-Engine ausgeführt. Genau das macht es möglich, ein Experiment im Dashboard zu erstellen oder zu bearbeiten, ohne dass auf Kundenseite ein neues Deployment erforderlich ist.
Eine CSP kann jedoch nur Code zulassen, den sie im Voraus kennt – über eine feste Quelle, einen Hash oder einen Nonce. Keine dieser Methoden 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 – genau das, was unsafe-eval steuert. Da Targeting-Logik und Content-Änderungen über dieselbe Engine laufen, gibt es keinen separaten, „sicheren“ Ausführungspfad, der nur für einfache Experimente (Text, CSS, Bilder) aktiviert werden könnte.
Mögliche Lösung
Anstatt unsafe-eval sitewide zuzulassen, kann die CSP für jede Route unterschiedlich konfiguriert werden. Seiten mit besonders strengen Anforderungen (z. B. Login- oder Authentifizierungsabläufe) bleiben strikt eval-free, während unsafe-eval nur auf Seiten erlaubt wird, auf denen tatsächlich Experimente laufen sollen.