FriendsOfREDAXO / consent_manager

Stellt ein Opt-In Cookie Banner zur Verfügung
MIT License
57 stars 15 forks source link

CSP violated-directive: script-src-elem #320

Open oioix opened 8 months ago

oioix commented 8 months ago

AddOns: consent_manager 4.2.0

Ähnlich wie das gestern beschriebene Problem in #319 nur, dass es dieses Mal um das injizierte Script geht, sobald die Zustimmung erteilt wurde/wird und vom consent_manager ein Script injiziert wird.

Wenn man CSP im Einsatz hat und in consent_manager einen Dienst verwendet, der nach dem Einverständnis ein Script lädt, bekommt man einen CSP-Verstoß.

Screenshot 2024-03-10 | 09 27 21

Das Problem In der Datei consent_manager_box.php Zeile 98 findet sich nachfolgende Zeile echo '<div style="display: none" class="consent_manager-script" data-uid="script-' . $uid . '" data-script="' . $script . '"></div>'; Diese Zeile wird nur geladen, wenn man einen Dienst mit Script aktiviert hat. Das div scheint leer zu sein, aber sobald ein consent erteilt ist, wird hier das Script injiziert: Screenshot 2024-03-10 | 09 39 46

Genau diese nachträgliche Injizierung ist das Problem, welches den CSP-Verstoß darstellt.

Ich habe versucht im Dienst, wo man das Script hinterlegt, einen nonce einzubinden. Leider geht das aus drei Gründen nicht.

  1. php ist dort funktionslos. Man kann also keinen zentral generierten nonce per php (zum Beispiel mit: global $myNonce) einlesen welches man dann dem Script tag übergeben könnte (zum Beispiel mit: nonce="<?= $myNonce ?>")
  2. selbst wenn php hier funktionieren würde und man einen nonce an das Script tag übergeben könnte, hätte es keinen Effekt, weil der consent_manager offenbar nur das Script selbst innerhalb des ausliest und deshalb ein nonce Attribut gar nicht erst erkannt werden würde.
  3. Selbst wenn 1. und 2. gelöst wären, bliebe immer noch ein drittes Problem. Das Script wird base64 codiert im Cache gespeichert und dann von dort base64 codiert im div intelegt, um dann bei Bedarf vom frontend JS interpretiert und injiziert zu werden. Der nonce wäre daher nie aktuell und korrekt.

Lösung? Einen nonce mitzugeben, würde nur gelingen, vorgenannten Punkte 1. bis 3. gelöst würden.

Ein ganz anderer vermutlich viel einfacherer Weg könnte sein, dass man das Script auf ganz anderem Weg aktiviert. Mein Vorschlag wäre, dass das benötigte Script immer geladen wird, aber noch nicht feuert, weil zuerst geprüft wird, ob ein bestimmtes Attribut vorhanden ist, welches benötigt wird, um das Script zu aktivieren. Anstatt also das Script zu injizieren, würde das Attribut in dem div injiziert werden (Beispiel data-script-firecode=""). Ist dies injiziert und damit vorhanden (Beispiel data-script-firecode="123XYZ") läuft das Script.