Unterstützte Hashes in „script-src“ erweitern

Carlos Joan Rafael Ibarra Lopez
Carlos Joan Rafael Ibarra Lopez
Mustafa Emre Acer
Mustafa Emre Acer

Veröffentlicht am 17. November 2025

Ab Chrome 141 können Sie am Ursprungstest teilnehmen, um die neuen CSP-Funktionen (Content Security Policy) zu testen, die in Chrome eingeführt werden. Diese Funktionen helfen Websites, sich vor XSS zu schützen, indem sie bekannte Quellen von JavaScript besser auf die Zulassungsliste setzen. Wenn Sie bekannte JavaScript-Quellen auf die Zulassungsliste setzen und alle anderen Quellen blockieren, können Sie XSS-Angriffe effektiv verhindern. Das vom Angreifer eingefügte JavaScript steht nicht auf der Zulassungsliste und wird daher blockiert.

Ohne diese Funktionen ist es schwierig, eine „strikte“ CSP zu haben, die alle JavaScript-Quellen auf die Zulassungsliste setzt, ohne dass ein Nonce-Kommunikationsmechanismus zwischen dem Skripthost und der Website vorhanden ist oder der vollständige Hash des Skripts im Voraus bekannt ist. Beide Methoden sind schwierig zu implementieren, wenn sich das Skript häufig ändert und von einem vertrauenswürdigen, aber separaten Drittanbieter gehostet wird. Wenn ein Script „eval“ verwenden muss, ist es derzeit erforderlich, „eval“ für alle Scripts auf die Zulassungsliste zu setzen, was die CSP erheblich schwächt.

Wir versuchen, diese Lücke zu schließen, indem wir einen stärkeren Mechanismus für die URL-basierte Zulassungsliste von Scripts in script-src und einen Mechanismus für die Zulassungsliste von Aufrufen von „eval“ bereitstellen. Sie können den vorhandenen Hash-Mechanismus in script-src verwenden, um URLs bestimmter Skripts und JavaScript, das an eval (und andere eval-ähnliche Funktionen) übergeben wird, auf die Zulassungsliste zu setzen. Die URL-basierte Zulassungsliste ist zwar nicht so streng wie ein integritätsbasierter CSP, aber dieser Mechanismus sollte eine große Verbesserung gegenüber der vorhandenen Hostnamen-Zulassungsliste darstellen.

Wir sind der Meinung, dass dies eine einfacher bereitzustellende CSP-Richtlinie ermöglicht, die XSS weiterhin effektiv verhindert, indem nicht zulässige Inline- und eval-Scripts blockiert werden. Diese neuen Funktionen wurden sorgfältig entwickelt und implementiert, damit Websites eine Richtlinie festlegen können, die in Browsern, die die neue Funktion unterstützen, für mehr Sicherheit sorgt, ohne dass es zu Problemen oder Sicherheitseinbußen in Browsern kommt, die die Funktion nicht unterstützen. Außerdem ist kein User-Agent-Sniffing erforderlich.

Anwendungsfälle

Bestimmte URLs für die Verwendung mit script-src auf die Zulassungsliste setzen

Für Websites, auf denen bestimmte Skripts für die Verwendung mit „script-src“ auf die Zulassungsliste gesetzt werden sollen, gibt es derzeit zwei Optionen: Die Inhalte der Skripts können über Subresource Integrity (SRI) auf die Zulassungsliste gesetzt werden oder es kann host-source verwendet werden, um Hostnamen auf die Zulassungsliste zu setzen. SRI ist oft nicht praktikabel für Skripts, die sich häufig ändern (z. B. Analyseskripts). Die Angabe von „host-source“ wird ignoriert, wenn auch strict-dynamic festgelegt ist. Außerdem bietet sie keinen umfassenden Schutz, da sie keine URL-Parameter enthält. Durch diese Änderung können Skripts anhand eines Hash ihrer (vollständigen) URL auf die Zulassungsliste gesetzt werden. Dies unterstützt sowohl dynamische Skripts als auch Konfigurationen, die strict-dynamic verwenden.

Bestimmte Scripts für die Verwendung mit „eval“ oder „eval“-ähnlichen Funktionen auf die Zulassungsliste setzen

Auf einigen Websites ist die Verwendung von eval oder eval-ähnlichen Funktionen erforderlich (Code wird als Stringliterale in setTimeout, setInterval und setImmediate übergeben). Für diese Websites ist nur die CSP-Option unsafe-eval verfügbar, mit der alle Aufrufe von eval aktiviert werden. Wir fügen einen Mechanismus hinzu, mit dem bestimmte Eingaben für „eval“ auf die Zulassungsliste gesetzt werden können. Mit diesem neuen Mechanismus können die benötigten Skripts durch Hashing der Skriptinhalte direkt eingeschränkt auf die Zulassungsliste gesetzt werden, anstatt eine zu weit gefasste „unsafe-eval“-CSP angeben zu müssen.

Jetzt starten

Wenn Sie die Unterstützung für Script- und Eval-Hashing testen möchten, nehmen Sie am Ursprungstest für URL- und Eval-Hashes in CSP script-src teil, der von Chrome 141 bis 144 läuft.

Hashes zu script-src hinzufügen

URLs werden auf die Zulassungsliste gesetzt, indem der CSP-Anweisung „script-src“ ein Wert in der Form url-<hash-algorithm>-<script-url-hash> hinzugefügt wird. Dadurch können alle Inhalte, die über diese URL bereitgestellt werden, unabhängig vom Inhalt ausgeführt werden. Der Hash muss nur die ursprüngliche URL (die auf der Seite enthaltene URL) und nicht die URL enthalten, zu der diese URL weiterleitet. Es werden sowohl absolute als auch relative URLs unterstützt.

Mit dem folgenden CSP-Header wird beispielsweise das Script auf die Zulassungsliste gesetzt, das unter https://example.com/example.js bereitgestellt wird:

Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';

Dabei ist 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' der SHA256-Hash von https://example.com/example.js.

Skripts, die über eval oder new Function ausgewertet werden, können auf die Zulassungsliste gesetzt werden, indem eval-<hash-algorithm>-<script-contents-hash> in den Skript-Src-Pfad aufgenommen wird. Mit dem folgenden CSP-Header wird beispielsweise das Übergeben des Strings alert("hello world") an eval() auf die Zulassungsliste gesetzt:

Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';

Dabei ist 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' der sha256-Hash von alert("hello world").

Um die Einführung zu beschleunigen, werden bei der Anmeldung einer Website für den Ursprungstest Hashes für URLs und eval in der DevTools-Konsole ausgegeben und in CSP-Berichte aufgenommen. Das bedeutet, dass eine strenge, aber report-only-Richtlinie verwendet werden kann, um alle Hashes aufzulisten, die für die Zulassungsliste erforderlich sind.

Abwärtskompatibilität beibehalten

Damit diese Richtlinien bereitgestellt werden können, bevor alle Browser Unterstützung dafür hinzugefügt haben, können URL-Hashes nach hostbasierten Zulassungslisten aufgeführt werden. Browser, die die neuen Hash-Typen unterstützen, ignorieren vorherige hostbasierte Zulassungslisten. Browser, die die neuen Hash-Typen nicht unterstützen, erzwingen weiterhin die hostbasierte Zulassungsliste. So können Websites beides festlegen und die strengere Richtlinie in Browsern verwenden, die sie unterstützen, ohne das Risiko einzugehen, dass in Browsern, die sie nicht unterstützen, Fehler auftreten. Das folgende Beispiel veranschaulicht dies.

Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

Außerdem haben wir „strict-dynamic-url“ eingeführt, das dem „strict-dynamic“-Attribut entspricht, aber nur angewendet wird, wenn URL-Hashes festgelegt sind. Da bei „strict-dynamic“ hostbasierte Zulassungslisten ignoriert werden, kann eine Website, die einen bestimmten Hash auf die Zulassungsliste setzen und „strict-dynamic“ anwenden möchte, eine Richtlinie wie die folgende verwenden:

Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

In diesem Beispiel wird in Browsern, die Hashes noch nicht unterstützen, nur https: erzwungen. unsafe-eval wird von unterstützenden Browsern ebenfalls ignoriert, wenn Eval-Hashes vorhanden sind. Die folgende Richtlinie wird beispielsweise als unsafe-eval ausgewertet. So kann eval() in Browsern verwendet werden, die noch keine Eval-Hashes unterstützen, während eval() von alert("hello world") nur in Browsern zulässig ist, die Eval-Hashes unterstützen.

  Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"

Feedback geben

Wir freuen uns über Feedback von Entwicklern zu diesen Erweiterungen an script-src. Posten Sie alle Kommentare als Problem im Explainer in GitHub.