Adobe Commerce: Inline-JavaScript-Probleme auf der Kaufbestätigungsseite im eingeschränkten Modus der Content Security Policy (CSP)
Dieser Artikel enthält detaillierte Erläuterungen und Lösungen für Probleme, die beim Auschecken mit benutzerdefiniertem JavaScript auftreten, das über Adobe Commerce Admin und Google Tag Manager in Adobe Commerce 2.4.7 hinzugefügt wurde, wenn eingeschränkter CSP-Modus aktiviert ist. Insbesondere wird die Fehlermeldung Ausführung des Inline-Skripts abgelehnt, da es gegen die folgende Fehlermeldung der Content Security Policy- verstößt, die im Protokoll der Browser-Konsole angezeigt wird. Dieser Fehler zeigt an, dass das Inline-Skript aufgrund der strengen CSP-Einstellungen blockiert ist, die die Sicherheit erhöhen sollen, indem sie die Ausführung nicht autorisierter Skripte verhindern.
Ab Adobe Commerce 2.4.7 ist CSP so konfiguriert, dass es für Zahlungsseiten in den Bereichen „Storefront und „Admin standardmäßig im-Modus ausgeführt wird. Für alle anderen Seiten ist der -Modus . Diese Verbesserung erfordert die Aufnahme aller JavaScript in die Whitelist, einschließlich benutzerdefinierter Integrationen mit Services oder Erweiterungen von Drittanbietern. Wenn benutzerdefinierte JavaScript nicht auf die Whitelist gesetzt werden, blockiert der Browser die Ausführung dieser Skripte auf der Checkout- und Zahlungsseite sowohl im Admin- als auch im Storefront-Bereich.
Die in diesem Artikel bereitgestellten Lösungen sind nicht auf die Lösung von Problemen mit Google Tag Manager (GTM) Inline JavaScript oder JavaScript beschränkt, die über die Design-Konfiguration von Commerce Admin hinzugefügt wurden. Sie können auch auf andere Szenarien angewendet werden, in denen dem Commerce-Code eine Inline-JavaScript hinzugefügt wurde. Dazu gehören benutzerdefinierte Skripte, die direkt in Vorlagen, Module oder andere Teile des Adobe Commerce-Ökosystems eingebettet sind. Durch Befolgen der beschriebenen Schritte können Sie sicherstellen, dass alle Inline-Skripte ordnungsgemäß auf die Whitelist gesetzt sind und ausgeführt werden dürfen, wodurch die Funktionalität Ihres benutzerdefinierten Codes erhalten bleibt und die CSP-Einschränkungen eingehalten werden.
HINWEIS: Es wird dringend empfohlen, neue JavaScript über Methoden einzuführen, die in der Dokumentation Inhaltssicherheitsrichtlinien von Adobe Commerce beschrieben sind. Diese Methoden stellen sicher, dass Ihre Skripte den CSP-Richtlinien entsprechen, was die Sicherheit Ihrer Commerce-Site erhöht. Durch Befolgen der Best Practices für die Skriptinklusion, z. B. die Verwendung externer Skripte mit ordnungsgemäßen Nonce- oder Hash-Attributen, können Sie das Risiko von Sicherheitslücken minimieren und ein reibungsloseres, sichereres Benutzererlebnis sicherstellen.
Beschreibung
Einzelheiten zur Umgebung und zu den Schritten zur Reproduktion finden Sie.
Umgebung
Adobe Commerce on Cloud Infrastructure und Adobe Commerce On-Premise:
- 2.4.7 und höher
- 2.4.6-pX
- 2,4,5-pX
- 2.4.4-pX
Problem/Symptome
Nachfolgend finden Sie eine Liste häufiger Probleme und deren Lösungen, wenn die Ausführung von Skripten auf Checkout- und Zahlungsseiten aufgrund von CSP-Einschränkungen blockiert ist:
- GTM HTML Tag mit Inline JavaScript
- Inline-JS in der Design-Konfiguration
GTM HTML Tag mit Inline JavaScript
Der JavaScript des benutzerdefinierten HTML-Tags, das in Google Tag Manager konfiguriert wurde, wird nicht ordnungsgemäß auf der Checkout- oder Zahlungsseite der Storefront ausgeführt.
Schritte zur Reproduktion
- Konfigurieren Sie den Google Tag Manager mit einem benutzerdefinierten HTML-Tag, das Inline-JavaScript enthält.
- Integrieren von Google Tag Manager mit Adobe Commerce. Anweisungen hierzu finden unter „KonfigurierenGoogle Analytics-Kontos“ im Handbuch für Adobe Commerce-Merchandising und -Promotions.
- Fügen Sie ein Produkt zum Warenkorb hinzu und fahren Sie mit der Kasse fort.
- Öffnen Sie die Developer Console in einem beliebigen unterstützten Browser.
Erwartete Ergebnisse
In der Konsole werden keine Fehler im Zusammenhang mit der benutzerdefinierten JavaScript angezeigt und das Skript wird erfolgreich ausgeführt.
Tatsächliche Ergebnisse
Der Fehler Ausführung eines Skripts wurde abgelehnt, da sein Hash, seine Nonce oder „unsafe-inline“ nicht in der script-src-Direktive der Content Security Policy angezeigt werden. in der Konsole vorhanden ist und das Skript nicht ausgeführt wird.
HINWEIS: Die genaue Fehlermeldung kann je nach Browser variieren, zeigt jedoch im Allgemeinen an, dass das Skript vom CSP blockiert wird. Diese Meldungen zeigen an, dass das Skript aufgrund der aktuellen CSP-Einstellungen nicht ausgeführt werden darf.
Ursache
Der JavaScript aus dem benutzerdefinierten HTML-Tag des Google Tag Managers wird vom Google Tag Manager selbst in die Storefront eingefügt. Daher wird dieses Skript nicht in den CSP-Einstellungen vorab auf die Zulassungsliste gesetzt und wird anschließend vom Browser daran gehindert, es auszuführen. Dies liegt daran, dass der CSP die Ausführung von Inline-Skripten einschränkt, die nicht explizit zulässig sind, was eine erhöhte Sicherheit gewährleistet, aber zusätzliche Konfigurationen für benutzerdefinierte Skripte erfordert.
Lösung
- Setzen Sie den JavaScript-Hash auf die Whitelist. Weitere Informationen finden Sie im Abschnitt Auflösung in diesem Artikel.
- Signieren Sie die benutzerdefinierte HTML-JavaScript des Google Tag Managers mit einer Nonce. Weitere Informationen finden Sie im Abschnitt Auflösung in diesem Artikel.
Inline-JS in der Design-Konfiguration
Dieses Problem ähnelt dem Problem mit dem benutzerdefinierten HTML-Tag mit Inline-JavaScript . Der Unterschied besteht darin, dass anstelle des JavaScripts im Google Tag Manager Admin das Skript im Adobe Commerce Admin auf der Seite Design-Konfiguration für einen der verfügbaren Bereiche hinzugefügt wird. Mit dieser Methode kann ein Inline-HTML-Snippet, ein JavaScript oder ein Stylesheet zur Kopf- oder Fußzeile des Designs hinzugefügt werden. Wie bei jeder anderen Inline-JavaScript ist es erforderlich, dass auf der Checkout-Seite eine Whitelist ausgeführt wird.
Schritte zur Reproduktion
- Konfigurieren Sie HTML-Kopf oder Fußzeile in Design-Konfiguration so, dass eine Inline-JavaScript enthalten ist.
- Fügen Sie ein Produkt zum Warenkorb hinzu und fahren Sie mit der Kasse fort.
- Öffnen Sie die Developer Console in einem beliebigen unterstützten Browser.
Erwartete Ergebnisse
In der Konsole werden keine Fehler im Zusammenhang mit der benutzerdefinierten JavaScript angezeigt und das Skript wird erfolgreich ausgeführt.
Tatsächliche Ergebnisse
Der Fehler Ausführung eines Skripts wurde abgelehnt, da sein Hash, seine Nonce oder „unsafe-inline“ nicht in der script-src-Direktive der Content Security Policy angezeigt werden. in der Konsole vorhanden ist und das Skript nicht ausgeführt wird.
HINWEIS: Die genaue Fehlermeldung kann je nach Browser variieren, sie zeigt jedoch im Allgemeinen an, dass das Skript vom CSP blockiert wird. Diese Meldungen zeigen an, dass das Skript aufgrund der aktuellen CSP-Einstellungen nicht ausgeführt werden darf.
Ursache
Bei Skripten und Stylesheets im HTML-Kopf und sonstigen HTML in den Fußzeile-Abschnitten der Design-Konfiguration handelt es sich um gemischte Eingabefelder. Diese Felder können HTML, Stylesheets oder JavaScript enthalten. Aufgrund dieses dynamischen Inhalts ist es nicht möglich, den Inhalt dieser Felder automatisch in Hash-Werte umzuwandeln und auf die Whitelist zu setzen. Wenn JavaScript zu einem dieser Felder hinzugefügt wird, muss es daher manuell auf die Whitelist gesetzt werden, damit es auf der Checkout-Seite ausgeführt werden kann. Dies ist erforderlich, da der CSP die Ausführung von Inline-Skripten einschränkt, die nicht explizit zulässig sind. Dies stellt zwar eine erhöhte Sicherheit sicher, erfordert jedoch zusätzliche Konfigurationen, um benutzerdefinierte Skripte zuzulassen.
Lösung
Setzen Sie den JavaScript-Hash auf die Whitelist. Weitere Informationen finden Sie im Abschnitt Auflösung in diesem Artikel.
Auflösung
Jede bereitgestellte Lösung arbeitet unabhängig voneinander. Sorgfältig bewerten und wählen Sie diejenige aus, die Ihren spezifischen Anforderungen am besten entspricht. Berücksichtigen Sie beim Ermitteln der geeigneten Lösung den Kontext Ihrer Implementierung, die Art der verwendeten Skripte und die Sicherheitsanforderungen Ihrer Adobe Commerce-Site.
Setzen Sie den JavaScript-Hash auf die Whitelist
Um dieses Problem zu beheben, müssen die benutzerdefinierten Inline-JavaScripts in den CSPEinstellungen aufWhitelist gesetzt werden. Dadurch wird sichergestellt, dass das Skript explizit ausgeführt werden darf, wobei die standardmäßigen Sicherheitsbeschränkungen umgangen werden.
Die Whitelist benutzerdefinierter GTM-HTML-Skripte ist eine Herausforderung, da GTM die JavaScript ändern kann, bevor es in das Dokumentobjektmodell (DOM) eingefügt wird, einschließlich der Entfernung von Zeilenumbrüchen und Kommentaren. Darüber hinaus können sich die Algorithmen von Google im Laufe der Zeit ohne Vorankündigung ändern, was den Hash ungültig machen könnte. Sie müssen den von Google Chrome generierten Hash wie in Schritt C beschrieben verwenden und darauf vorbereitet sein, den Hash in Ihrer Whitelist regelmäßig zu aktualisieren. Alternativ können Sie für eine robustere Lösung auch eine benutzerdefinierte HTML-JavaScript für Google Tag Manager mit einer Nonce signieren.
-
Generieren Sie den Hash für den JavaScript-Hauptteil.
HINWEIS: Um den Hash erfolgreich zu generieren, müssen Sie das Skript in den Hash-Generator einspeisen. Es ist wichtig, das Skript sorgfältig zu kopieren. Schließen Sie die öffnenden und schließenden Skript-Tags der JavaScript aus, während Sie alle Zeilenumbrüche und mögliche unsichtbare Zeichen kopieren. Dazu gehören die Zeilenumbrüche (falls vorhanden) nach dem
script
oder anderen Tags. Wenn der Hash nicht genau mit dem Skript übereinstimmt, wird die Ausführung verweigert.-
In einem Mac können Sie den gesamten Skripttext, einschließlich aller Zeilenumbrüche nach dem Öffnen
script
-Tags, in die Zwischenablage kopieren und den folgenden Befehl im Terminal ausführen.php -r „echo base64_encode(hash('SHA256', shell_exec('pbpaste'), true) ) . PHP_EOL;“
Dieser PHP-Befehl nimmt den Inhalt der Zwischenablage, berechnet seinen SHA-256-Hash, konvertiert den Hash in eine Binärdatei und kodiert ihn dann im Base64-Format, um schließlich das Ergebnis zu drucken.
-
Sie können eine Vielzahl von Online-Hash-Generatoren verwenden, um den erforderlichen Hash für Ihr Skript zu erstellen.
WARNUNG: Es ist wichtig zu verstehen, dass Sie die Auswirkungen auf den Datenschutz berücksichtigen müssen, wenn Sie sich entscheiden, Online-Services von Drittanbietern zu verwenden, um Hashes für CSP zu generieren. Einige Dienste können Ihr Skript zum Hashing auf ihre Server hochladen, wodurch möglicherweise vertrauliche Daten, die in Ihrem Skript enthalten sind, gefährdet werden. Um dieses Risiko zu mindern, wird empfohlen, Hashes mithilfe von vertrauenswürdigen Tools oder Skripten lokal zu generieren, um sicherzustellen, dass Ihre Daten sicher und privat bleiben.
-
Sie können den Google Chrome-Browser verwenden, um den bereits generierten Hash für die JavaScript abzurufen, deren Ausführung auf der Kaufbestätigungsseite von der Developer Console verweigert wurde.
-
Gehen Sie zur Kaufbestätigungsseite, indem Sie den Google Chrome-Browser verwenden, dem die blockierte JavaScript hinzugefügt wurde.
-
Öffnen Sie die Developer Console, indem Sie
Cmd+Option+J
(unter macOS) oderCtrl+Shift+J
(unter Windows/Linux) drücken. -
Suchen Sie die CSP-Fehlermeldung in der Konsole.
-
Im letzten Satz der Fehlermeldung finden Sie den generierten Hash-Code für das blockierte Skript.
-
Kopieren Sie den Code nach dem
sha256-
, wobei Sie die Anführungszeichen weglassen.HINWEIS: Wenn mehrere JavaScript-Dateien blockiert sind, werden in der Konsole mehrere Fehlermeldungen angezeigt. Stellen Sie sicher, dass Sie genau die JavaScript identifizieren, die auf die Whitelist gesetzt werden muss. Es wird empfohlen, jede JavaScript-Datei einzeln hinzuzufügen und zu testen, um zu vermeiden, dass das falsche Skript auf die Whitelist gesetzt wird.
Weitere Informationen zum Generieren eines Hash für JavaScript im Inline-Modus finden Sie im Abschnitt Erweiterte CSP-Konfiguration im Handbuch zu Inhaltssicherheitsrichtlinien für Adobe Commerce-Entwickler.
-
-
-
Setzen Sie den Skript-Hash auf die Whitelist. Fügen Sie zuerst "" zur Datei „csp_whitelist.xml“ Ihres Moduls hinzu:
<
Werte>
<
value id=„my-script“ type=„hash“ algorithm=„sha256“>
YOUR-HASH-1<
/value>
<
/values>
Dabei sollte IHR-HASH-1 durch den Hash ersetzt werden, den Sie im vorherigen Schritt erworben haben.
Um mehrere Skripte auf die Whitelist zu setzen, fügen Sie für>
Skript einen<
Wert<
/value>
hinzu, z. B.:<
Werte>
<
value id=„my-script“ type=„hash“ algorithm=„sha256“>
YOUR-HASH-1<
/value>
<
value id=„my-new-script“ type=„hash“ algorithm=„sha256“>
YOUR-HASH-2<
/value>
<
Werte>
Wenn die Datei nicht vorhanden ist, erstellen Sie sie mit folgendem Inhalt.
<
?xml version=„1.0“ encoding=„UTF-8“?>
<
csp_whitelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation=„urn:magento:module:Magento_Csp:etc/csp_whitelist.xsd"
>
<
Richtlinien>
<
-Richtlinie id=„script-src“>
<
Werte>
<
value id=„my-script“ type=„hash“ algorithm=„sha256“>
YOUR-HASH-1<
/value>
<
value id=„my-new-script“ type=„hash“ algorithm=„sha256“>
YOUR-HASH-2<
/value>
<
/values>
<
/policy>
<
/policies>
<
/csp_whitelist>
-
Leeren Sie den Cache: Nachdem Sie den Hash zur
csp_whitelist.xml
-Datei hinzugefügt haben, müssen Sie den Cache leeren um sicherzustellen, dass die Änderungen wirksam werden. Durch Leeren des Caches werden die gespeicherten Daten gelöscht, sodass die aktualisierten CSP-Einstellungen sofort angewendet werden können. Sie können den Cache leeren, indem Sie zu "">
Tools>
Sie Cache-) im Admin-Panel von Commerce und wählen Sie die Schaltfläche Leeren des Magento-) aus. Verwenden Sie alternativ die Befehlszeile:bin/magento cache:flush
Dieser Befehl löscht alle Cache-Typen und stellt sicher, dass Ihre neuen CSP-Einstellungen vom System erkannt werden.
Signieren Sie Google Tag Manager Custom HTML JavaScript mit einer Nonce
Eine weitere Möglichkeit, die Ausführung von JavaScript in GTM zu ermöglichen, besteht darin, eine Nonce zum öffnenden -Tag des Skripts hinzuzufügen. Das Attribut nonce bietet eine Möglichkeit, bestimmte Inline-Skripte dynamisch auf die Whitelist zu setzen und sicherzustellen, dass sie ausgeführt werden dürfen. Weitere Informationen finden Sie in der Dokumentation Verwenden des CSP-Nonce-Anbieters zum Zulassen von InlineSkripten .
WARNUNG: Denken Sie daran, dass ein Angreifer, wenn das GTM-Konto kompromittiert ist, schädliche JavaScript in die Storefront injizieren und sie mit der Nonce signieren kann, was ihre Ausführung ermöglicht. Dies könnte während des Checkout-Prozesses zum Diebstahl sensibler Daten führen.
Adobe Commerce-Entwicklungs-Teil
HINWEIS: CSP Nonce Variable Injection ist in Adobe Commerce 2.4.8 und höheren Versionen standardmäßig verfügbar. Wenn Sie diese benutzerdefinierte Injektion in früheren Versionen von Adobe Commerce implementieren, setzen Sie diese Anpassungen zurück, bevor Sie ein Upgrade auf Adobe Commerce 2.4.8 oder höher durchführen. Wenn Sie Adobe Commerce 2.4.8 oder höher ausführen, gehen Sie zum Abschnitt GTM-Konfiguration .
-
Verwenden Sie in Ihrem benutzerdefinierten Modul CSP Nonce Provider und übergeben Sie die Nonce an die JavaScript. Weitere Informationen finden Sie unter Grundlegende Vorlagenkonzepte in der Adobe Commerce Developer-Dokumentation.
-
Fügen Sie die globale Variable mit der Nonce mithilfe von JavaScript ein:
<
Skript>
window.cspNonce = config.cspNonce;
<
/script>
-
Dieses Skript legt eine globale Variable
cspNonce
mit dem Wert der aktuellen Nonce fest, die dann in der Variablen "Google Tag Manager“ erfasst und zum Signieren von benutzerdefinierten HTML-Skripten verwendet werden kann, um sicherzustellen, dass sie unter der CSP ausgeführt werden dürfen. Es sollte auf allen Seiten injiziert werden.
GTM-Konfigurationsteil
-
Erfasst den Wert dieser Variablen aus GTM:
-
Erstellen Sie eine Google Tag Manager-Variable vom Typ JavaScript-Variable. Benennen Sie die Variable klar, da sie später referenziert wird. In diesem Beispiel ist es
gtmNonce
. -
Legen Sie Globaler Variablenname auf den Namen der globalen JavaScript-Variablen fest, die Sie im vorherigen Schritt eingefügt haben. In diesem Beispiel ist es
cspNonce
.
-
-
Ändern Sie Ihren benutzerdefinierten HTML-Block, der die JavaScript enthält, die Sie beim Auschecken ausführen müssen, sodass er das Nonce-Attribut enthält, das auf die zuvor erstellte GTM-Variable verweist.
<
script nonce="{{gtmNonce}}">
console.log(„This is a test„);
<
/script>
HINWEIS: Stellen Sie sicher, dass Sie das Kontrollkästchen Support document.write aktivieren, da dies für das ordnungsgemäße Funktionieren des Skripts unerlässlich ist.
Durch Hinzufügen des Attributs nonce wird das Skript mit der bereitgestellten Nonce signiert, sodass es sicher unter der Content Security Policy (CSP) ausgeführt werden kann.