{"id":13168,"date":"2026-09-27T12:45:00","date_gmt":"2026-09-27T10:45:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13168"},"modified":"2026-10-26T12:11:33","modified_gmt":"2026-10-26T11:11:33","slug":"tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/","title":{"rendered":"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf"},"content":{"rendered":"<p>Ein direkt in einer Seite ausgef\u00fchrtes Fremdskript kann mit den Rechten dieser Seite auf den DOM und viele Browserfunktionen zugreifen. Der DOM ist die Darstellung der Seite im Browser, einschlie\u00dflich Texten, Formularen und anderen Elementen. Browsergrenzen gelten weiterhin: Fremde Frames, HttpOnly-Cookies und berechtigungspflichtige Schnittstellen sind nicht einfach frei zug\u00e4nglich. Die Pr\u00fcfung muss deshalb den tats\u00e4chlichen Einbindungskontext feststellen.<\/p>\n<p>Formatieren und Stichwortsuchen helfen bei der ersten Sichtung. Sechs Suchl\u00e4ufe erfassen aber nicht jede F\u00e4higkeit, beweisen keine Harmlosigkeit und ersetzen keine Sicherheitspr\u00fcfung. Ein brauchbares Ergebnis ist ein nachvollziehbarer Befund: genaue Datei, m\u00f6gliche F\u00e4higkeiten, beobachtetes Verhalten, ben\u00f6tigte Ziele und offene Fragen.<\/p>\n<h2>Eine reproduzierbare Kopie als Ausgangspunkt<\/h2>\n<p>Das folgende Bash-Beispiel ben\u00f6tigt curl, sha256sum und eine bereits installierte, freigegebene Version von js-beautify. Vor der Nutzung ersetzt die echte Anbieteradresse die reservierte Beispieladresse. Ein eigener Pr\u00fcfungsordner erh\u00e4lt jeden datierten Schnappschuss. Der Download speichert Header und endg\u00fcltige Adresse, bricht bei HTTP-Fehlern ab und erlaubt nur HTTPS-Weiterleitungen. Die heruntergeladene Datei wird dabei nicht ausgef\u00fchrt.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-eu<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">curl<\/span> <span class=\"cbb-attr\">--fail<\/span> <span class=\"cbb-attr\">--show-error<\/span> <span class=\"cbb-attr\">--silent<\/span> <span class=\"cbb-attr\">--location<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--proto<\/span> <span class=\"cbb-string\">'=https'<\/span> <span class=\"cbb-attr\">--proto-redir<\/span> <span class=\"cbb-string\">'=https'<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--connect-timeout<\/span> <span class=\"cbb-number\">10<\/span> <span class=\"cbb-attr\">--max-time<\/span> <span class=\"cbb-number\">60<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--dump-header<\/span> widget.headers.txt   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--write-out<\/span> <span class=\"cbb-string\">'%{url_effective}\\n'<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--output<\/span> widget.raw.js \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-string\">'https:\/\/cdn.vendor.example\/widget.js'<\/span> <span class=\"cbb-operator\">&gt;<\/span> widget.final-url.txt\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">test<\/span> <span class=\"cbb-attr\">-s<\/span> widget.raw.js\n<\/span><span class=\"cbb-line\">sha256sum widget.raw.js <span class=\"cbb-operator\">&gt;<\/span> widget.sha256\n<\/span><span class=\"cbb-line\">js-beautify <span class=\"cbb-attr\">--version<\/span>\n<\/span><span class=\"cbb-line\">js-beautify widget.raw.js <span class=\"cbb-attr\">-o<\/span> widget.pretty.js<\/span><\/code><\/pre><\/figure>\n<p>Auch nach erfolgreichem Download sind Inhalt und Content-Type zu pr\u00fcfen: Eine HTML-Anmeldeseite mit Status 200 ist nicht das erwartete JavaScript. Formatiererversion und Abrufzeit geh\u00f6ren ins Protokoll. F\u00fcr Pr\u00fcfsummen bleiben die unver\u00e4nderten Bytes ma\u00dfgeblich; die formatierte Kopie dient nur dem Lesen. Der Gr\u00f6\u00dfenunterschied ist weder ein Sicherheitsma\u00df noch eine zuverl\u00e4ssige Messung der Transportkompression.<\/p>\n<p>Formatieren stellt beim Bau entfernte Namen, Kommentare oder Quellstrukturen nicht wieder her. Source Maps ordnen Stellen der ausgelieferten Datei dem urspr\u00fcnglichen Quellcode zu. Vorhandene Zuordnungsdateien erleichtern die Sichtung, m\u00fcssen aber zur ausgelieferten Datei passen. Auch DevTools kann Antwortinhalte speichern und Netzwerkprotokolle exportieren; eine Browserpr\u00fcfung l\u00e4sst sich daher durchaus dokumentieren. Vor einer Weitergabe ben\u00f6tigen aufgezeichnete Adressen und Nutzdaten gegebenenfalls eine Bereinigung.<\/p>\n<h2>Sechs Suchl\u00e4ufe nach m\u00f6glichen Fundstellen<\/h2>\n<p>Diese Beispiele erfassen einige verbreitete Schreibweisen. Ein Treffer kann in einem Kommentar oder ungenutzten Zweig stehen; ein fehlender Treffer schlie\u00dft die F\u00e4higkeit nicht aus. Ein Skript kann etwa <code>globalThis[\"fe\" + \"tch\"](...)<\/code> aufrufen, einen Alias nutzen oder weiteren Code laden. Die sechs Gruppen strukturieren die Pr\u00fcfung und erteilen keine Freigabe.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\"># Network-related candidates<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'fetch&#91;&#91;:space:&#93;&#93;*\\(|XMLHttpRequest|sendBeacon|WebSocket|EventSource|new&#91;&#91;:space:&#93;&#93;+Image'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Storage and cookie candidates<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'localStorage|sessionStorage|cookie|indexedDB|caches'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Additional code or resource loading<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'createElement|import&#91;&#91;:space:&#93;&#93;*\\(|importScripts|Worker|\\.src&#91;&#91;:space:&#93;&#93;*='<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Input and form handling<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'addEventListener|oninput|onkeydown|onsubmit|FormData|\\.value'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Device and rendering features<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'getContext|toDataURL|AudioContext|hardwareConcurrency|RTCPeerConnection'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Literal HTTP(S) host candidates only<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-oiE<\/span> <span class=\"cbb-string\">'https?:\/\/&#91;a-z0-9.-&#93;+'<\/span> widget.pretty.js <span class=\"cbb-operator\">|<\/span> <span class=\"cbb-function\">sort<\/span> <span class=\"cbb-attr\">-u<\/span><\/span><\/code><\/pre><\/figure>\n<p>Die Speichersuche unterscheidet nicht zwischen Lesen und Schreiben. Sitzungsspeicher entspricht keiner unbegrenzten Aufbewahrung. Bei Eingaben z\u00e4hlen das tats\u00e4chliche Element, weitergeleitete Ereignisse, ausgelesene Werte und deren sp\u00e4tere \u00dcbertragung. Canvas-, Audio- oder WebRTC-Nutzung allein beweist kein Fingerprinting: Auch Funktionstests und legitime Darstellung kommen infrage. Zweck und Datenfluss entscheiden \u00fcber den Befund.<\/p>\n<p>Die Einwilligungsfrage l\u00e4sst sich nicht allein aus \u201eSpeicherung plus \u00dcbertragung\u201c ableiten. Auch das Auslesen von Endger\u00e4teinformationen kann ohne neues Cookie relevant sein. Ein Skript ohne Stichworttreffer ist nicht automatisch eine harmlose Darstellungshilfe. Zweck, Zugriffs- und Speichervorg\u00e4nge, personenbezogene Daten und anwendbare Ausnahmen ben\u00f6tigen eine eigene Bewertung. Die EDSA-Leitlinien beschreiben den technischen Anwendungsbereich \u00fcber klassische Cookies hinaus.<\/p>\n<figure class=\"lw-diagram\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-13168-thirdparty-20261025.png\" width=\"1120\" height=\"580\" loading=\"lazy\" decoding=\"async\" alt=\"Vier erg\u00e4nzende Pr\u00fcfungen: gesicherte Quelle, isolierte Verhaltenstests, CSP-Ressourcenregeln und Integrit\u00e4tskontrolle.\"><figcaption>Suchtreffer sind Pr\u00fcfans\u00e4tze. Keine Einzelpr\u00fcfung erfasst jedes zuk\u00fcnftige Skriptverhalten.<\/figcaption><\/figure>\n<h2>Minifizierung und Verschleierung<\/h2>\n<p>Minifizierung verkleinert den Code, etwa durch Entfernen von Leerzeichen und K\u00fcrzen interner Namen; Verschleierung soll das Verst\u00e4ndnis erschweren. Kodierte Zeichenkettenlisten, berechnete Eigenschaftsnamen und dynamische Codeerzeugung sind Pr\u00fcfans\u00e4tze, aber kein Beweis f\u00fcr sch\u00e4dliche Absicht. Base64-Dekodierung mit <code>atob<\/code> hat legitime Anwendungen au\u00dferhalb von Bildern. Umgekehrt kann ein berechneter Eigenschaftszugriff eine einfache Suche bereits ohne aufwendige Verschleierung umgehen.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'eval&#91;&#91;:space:&#93;&#93;*\\(|Function&#91;&#91;:space:&#93;&#93;*\\(|atob&#91;&#91;:space:&#93;&#93;*\\(|String\\.fromCharCode|\\\\x&#91;0-9a-fA-F&#93;{2}'<\/span> widget.pretty.js<\/span><\/code><\/pre><\/figure>\n<p>Auch verschleierter Code kann sich durch Dekodierung, Source Maps oder vertiefte statische Analyse erschlie\u00dfen. Ein isolierter Laufzeittest liefert zus\u00e4tzliche Nachweise, allerdings nur f\u00fcr tats\u00e4chlich durchlaufene Pfade. Eine Testseite enth\u00e4lt k\u00fcnstliche Daten und keine aktiven Produktionskonten. Zur Verhaltenspr\u00fcfung geh\u00f6rt unbekannter Code nicht in einen gew\u00f6hnlichen angemeldeten Browser oder auf die Produktionsseite.<\/p>\n<h2>Aus Host-Kandidaten entsteht nicht automatisch eine CSP<\/h2>\n<p>Der Host-Ausdruck oben erfasst bewusst nur einfache ausgeschriebene HTTP(S)-Pr\u00e4fixe. Relative Adressen, protokollrelative URLs, WebSocket-Adressen, kodierte Zeichenketten und zusammengesetzte Ziele fehlen; auch Portangaben gehen verloren. Kommentare und Dokumentationsadressen k\u00f6nnen irrelevante Treffer liefern. Eine Content Security Policy (CSP) legt fest, aus welchen Quellen der Browser Skripte, Verbindungen und andere Ressourcen beziehen darf. Eine brauchbare Zielliste verbindet Codekontext, tats\u00e4chliche Anfragen, Weiterleitungen und Anbieterdokumentation.<\/p>\n<p>Der Ressourcentyp bestimmt die CSP-Anweisung: Skriptladen, API-Verbindungen und Bildabrufe sind unterschiedliche Vorg\u00e4nge. Ein Host im Text reicht nicht als Grund f\u00fcr eine Freigabe. Das folgende Nur-Bericht-Beispiel illustriert eine kleine fiktive Website. Domains und Berichtsempf\u00e4nger sind Platzhalter; die vollst\u00e4ndige Anwendungsrichtlinie ben\u00f6tigt eine eigene Pr\u00fcfung.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">Reporting-Endpoints: csp=\"https:\/\/reports.site.example\/csp\"\n<\/span><span class=\"cbb-line\">Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https:\/\/cdn.vendor.example; connect-src 'self' https:\/\/api.vendor.example; img-src 'self' https:\/\/images.vendor.example; report-to csp<\/span><\/code><\/pre><\/figure>\n<p>Jeder Header steht in einer HTTP-Headerzeile. Der Berichtsendpunkt muss tats\u00e4chlich existieren. Report-Only beobachtet Verst\u00f6\u00dfe, blockiert aber nicht. Berichte h\u00e4ngen von Browserunterst\u00fctzung, Zustellung und durchlaufenen Pfaden ab. Fehlende Meldungen beweisen keine Vollst\u00e4ndigkeit, und eine feste Woche deckt nicht alle Bedingungen ab. Konsolen- und Netzwerkbeobachtung bleiben Teil des Tests.<\/p>\n<p>Eine Host-Freigabeliste fixiert keine Dateiinhalte. Ein weiteres Skript vom bereits erlaubten Host kann ohne zus\u00e4tzlichen Host-Eintrag laden. Bei Vertrauen \u00fcber Nonce oder Hash und <code>'strict-dynamic'<\/code> k\u00f6nnen unterst\u00fctzende Browser au\u00dferdem dynamisch geladene Abh\u00e4ngigkeiten ohne gesonderte Host-Eintr\u00e4ge zulassen. CSP schlie\u00dft daher nicht jede L\u00fccke eines unver\u00e4nderten Laders.<\/p>\n<h2>SRI bindet die gepr\u00fcften Bytes<\/h2>\n<p>F\u00fcr eine geeignete stabile Skriptantwort vergleicht Subresource Integrity die Bytes vor der Ausf\u00fchrung mit einer erwarteten Pr\u00fcfsumme. Die Pr\u00fcfsumme stammt aus der gepr\u00fcften unver\u00e4nderten Datei, nicht aus der formatierten Kopie. Dieses Python-Beispiel gibt den tats\u00e4chlichen SHA-384-Integrit\u00e4tswert aus:<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> base64\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> hashlib\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> pathlib <span class=\"cbb-keyword\">import<\/span> Path\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">raw = <span class=\"cbb-function\">Path<\/span>(<span class=\"cbb-string\">\"widget.raw.js\"<\/span>).<span class=\"cbb-function\">read_bytes<\/span>()\n<\/span><span class=\"cbb-line\">digest = base64.<span class=\"cbb-function\">b64encode<\/span>(hashlib.<span class=\"cbb-function\">sha384<\/span>(raw).<span class=\"cbb-function\">digest<\/span>()).<span class=\"cbb-function\">decode<\/span>(<span class=\"cbb-string\">\"ascii\"<\/span>)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"sha384-\"<\/span> + digest)<\/span><\/code><\/pre><\/figure>\n<p>Die vollst\u00e4ndige Ausgabe ersetzt den folgenden Platzhalter. Der Platzhalter ist ausdr\u00fccklich keine g\u00fcltige Pr\u00fcfsumme f\u00fcr eine Einbindung.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"html\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">HTML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-html\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-punct\">&lt;<\/span><span class=\"cbb-tag\">script<\/span> <span class=\"cbb-attr\">src<\/span><span class=\"cbb-punct\">=<\/span><span class=\"cbb-string\">\"https:\/\/cdn.vendor.example\/widget.js\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">integrity<\/span><span class=\"cbb-punct\">=<\/span><span class=\"cbb-string\">\"sha384-REPLACE_WITH_REVIEWED_BASE64_DIGEST\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">crossorigin<\/span><span class=\"cbb-punct\">=<\/span><span class=\"cbb-string\">\"anonymous\"<\/span><span class=\"cbb-punct\">&gt;<\/span><span class=\"cbb-punct\">&lt;\/<\/span><span class=\"cbb-tag\">script<\/span><span class=\"cbb-punct\">&gt;<\/span><\/span><\/code><\/pre><\/figure>\n<p>Eine abweichende Antwort besteht die Integrit\u00e4tspr\u00fcfung nicht. F\u00fcr diesen Fall ben\u00f6tigt die Anwendung ein festgelegtes Verhalten; ein automatisches \u00dcbernehmen der gerade ausgelieferten Anbieter-Pr\u00fcfsumme w\u00e4re keine erneute Pr\u00fcfung. Bei fremdem Ursprung setzt SRI au\u00dferdem eine passende CORS-Antwort voraus. <code>crossorigin=\"anonymous\"<\/code> verwendet CORS mit dem Berechtigungsmodus same-origin: Bei fremdem Ursprung entfallen Zugangsdaten, bei gleichem Ursprung k\u00f6nnen weiterhin Zugangsdaten mitgesendet werden.<\/p>\n<p>Ein ver\u00e4nderlicher Tag-Container ist nicht grunds\u00e4tzlich unvereinbar mit Pr\u00fcfsummen. Dynamische oder personalisierte Antworten, fehlende CORS-Unterst\u00fctzung und h\u00e4ufige Ver\u00f6ffentlichungen k\u00f6nnen eine stabile SRI-Einbindung jedoch ungeeignet machen oder au\u00dferhalb der Anbieterunterst\u00fctzung liegen. Ohne Fixierung bleiben Ver\u00f6ffentlichungskontrollen, gepr\u00fcfte Versionen und \u00dcberwachung erforderlich. Keine dieser Ma\u00dfnahmen best\u00e4tigt beliebigen zuk\u00fcnftigen Code.<\/p>\n<div class=\"lw-faq\">\n<h2>Fragen und Antworten<\/h2>\n<h3>Erfasst die Pr\u00fcfsumme des Laders alle Abh\u00e4ngigkeiten?<\/h3>\n<p>Nein. Die Pr\u00fcfsumme an einem Skript-Element gilt f\u00fcr die damit abgerufene Ressource, nicht f\u00fcr jedes sp\u00e4ter geladene Skript oder jede Konfigurationsantwort. Ein dynamisch erzeugtes Skript kann eigene Integrit\u00e4tsmetadaten erhalten, sofern der Lader das unterst\u00fctzt. Ansonsten ben\u00f6tigt jede Abh\u00e4ngigkeit eine gesonderte Bewertung; ein erlaubter Host ist keine Integrit\u00e4tsgarantie.<\/p>\n<h3>Beweist eine unver\u00e4nderte w\u00f6chentliche Pr\u00fcfsumme gleiches Verhalten?<\/h3>\n<p>Nein. Identische Bytes k\u00f6nnen wegen externer Konfiguration, Zeitpunkt, Standort, Einwilligung, Kontozustand oder ge\u00e4nderter Abh\u00e4ngigkeiten anders reagieren. Eine ge\u00e4nderte Pr\u00fcfsumme ist ein Pr\u00fcfhinweis und kein Urteil. Der Vergleichsrhythmus richtet sich nach Aktualisierungsverfahren und Risiko der Einbindung; Laufzeittests decken zus\u00e4tzlich relevante Bedingungen ab.<\/p>\n<h3>Was geh\u00f6rt zur Pr\u00fcfung einer Aktualisierung?<\/h3>\n<ol><li>Ein neuer unver\u00e4nderter Schnappschuss mit Abrufnachweis neben der zuvor akzeptierten Version.<\/li><li>Ein Vergleich von Code, m\u00f6glichen Zielen und Abh\u00e4ngigkeiten im Zusammenhang; ge\u00e4nderte Minifizierung kann Zeilenvergleiche un\u00fcbersichtlich machen.<\/li><li>Isolierte Tests f\u00fcr relevante Seiten, Einwilligungszust\u00e4nde und Interaktionen samt Netzwerk- und Speicherbeobachtung.<\/li><li>Eine dokumentierte Entscheidung zu jedem neuen Ziel oder Funktionsumfang vor einer \u00c4nderung der CSP oder akzeptierten Pr\u00fcfsumme.<\/li><\/ol>\n<p>Serverseitige Nutzung, Aufbewahrung und Weitergabe lassen sich nicht allein aus Browsercode feststellen. Dazu geh\u00f6ren Anbieternachweise und die einschl\u00e4gige Vertragsdokumentation. Die technische Pr\u00fcfung pr\u00e4zisiert die Fragen und verifiziert nicht eigenst\u00e4ndig die gesamte Verarbeitungskette des Anbieters.<\/p>\n<\/div>\n<div class=\"lw-quellen\"><h2>Quellen<\/h2><ul><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\">MDN: JavaScript-Dokumentation<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Property_accessors\">MDN: Zugriff auf JavaScript-Eigenschaften<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Security\/Defenses\/Same-origin_policy\">MDN: Regeln f\u00fcr gleichen Ursprung<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Document\/cookie\">MDN: Document.cookie<\/a><\/li><li><a href=\"https:\/\/developer.chrome.com\/docs\/devtools\/javascript\/source-maps\">Chrome DevTools: Urspr\u00fcnglichen Code mit Source Maps pr\u00fcfen<\/a><\/li><li><a href=\"https:\/\/developer.chrome.com\/docs\/devtools\/network\/reference\">Chrome DevTools: Netzwerkfunktionen<\/a><\/li><li><a href=\"https:\/\/github.com\/beautifier\/js-beautify\">js-beautify: Projektdokumentation und Befehlszeile<\/a><\/li><li><a href=\"https:\/\/curl.se\/docs\/manpage.html\">curl: Befehlszeilenhandbuch<\/a><\/li><li><a href=\"https:\/\/www.edpb.europa.eu\/system\/files\/2024-10\/edpb_guidelines_202302_technical_scope_art_53_eprivacydirective_v2_en_0.pdf\">EDSA: Leitlinien 2\/2023 zum technischen Anwendungsbereich von Artikel 5 Absatz 3, Version 2.0<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Headers\/Content-Security-Policy\/script-src\">MDN: Content-Security-Policy script-src<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Headers\/Content-Security-Policy-Report-Only\">MDN: Content-Security-Policy-Report-Only<\/a><\/li><li><a href=\"https:\/\/www.w3.org\/TR\/CSP3\/\">W3C: Content Security Policy Stufe 3<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Security\/Defenses\/Subresource_Integrity\">MDN: Subresource Integrity<\/a><\/li><li><a href=\"https:\/\/www.w3.org\/TR\/sri\/\">W3C: Subresource Integrity<\/a><\/li><li><a href=\"https:\/\/html.spec.whatwg.org\/multipage\/urls-and-fetching.html#cors-settings-attributes\">WHATWG HTML: Attribute f\u00fcr CORS-Einstellungen<\/a><\/li><\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Eine strukturierte Pr\u00fcfung verbindet gesicherte Quelldateien, gezielte Suchen, isolierte Verhaltenstests, CSP-Regeln und Integrit\u00e4tskontrollen. Suchtreffer liefern Hinweise; fehlende Treffer schlie\u00dfen eine Funktion nicht aus.<\/p>\n","protected":false},"author":1,"featured_media":29418,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[156],"tags":[92268,92235,92292,92071],"class_list":["post-13168","post","type-post","status-publish","format-standard","hentry","category-tutorials-de-web-entwicklung","tag-javascript-de","tag-tutorial-de","tag-web-performance-de","tag-web-security-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Ein Anbieterskript formatieren, die sechs lohnenden Suchmuster, die Hostliste f\u00fcr eine CSP herausziehen und warum Festnageln bei einem Container scheitert.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Ein Anbieterskript formatieren, die sechs lohnenden Suchmuster, die Hostliste f\u00fcr eine CSP herausziehen und warum Festnageln bei einem Container scheitert.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-27T10:45:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:11:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13168.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf\",\"datePublished\":\"2026-09-27T10:45:00+00:00\",\"dateModified\":\"2026-10-26T11:11:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/\"},\"wordCount\":1341,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13168.png\",\"keywords\":[\"JavaScript\",\"Tutorial\",\"Web Performance\",\"Web Security\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/\",\"name\":\"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13168.png\",\"datePublished\":\"2026-09-27T10:45:00+00:00\",\"dateModified\":\"2026-10-26T11:11:33+00:00\",\"description\":\"Ein Anbieterskript formatieren, die sechs lohnenden Suchmuster, die Hostliste f\u00fcr eine CSP herausziehen und warum Festnageln bei einem Container scheitert.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13168.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13168.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf | Lukas Wojcik","description":"Ein Anbieterskript formatieren, die sechs lohnenden Suchmuster, die Hostliste f\u00fcr eine CSP herausziehen und warum Festnageln bei einem Container scheitert.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf | Lukas Wojcik","og_description":"Ein Anbieterskript formatieren, die sechs lohnenden Suchmuster, die Hostliste f\u00fcr eine CSP herausziehen und warum Festnageln bei einem Container scheitert.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-27T10:45:00+00:00","article_modified_time":"2026-10-26T11:11:33+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13168.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf","datePublished":"2026-09-27T10:45:00+00:00","dateModified":"2026-10-26T11:11:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/"},"wordCount":1341,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13168.png","keywords":["JavaScript","Tutorial","Web Performance","Web Security"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/","name":"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13168.png","datePublished":"2026-09-27T10:45:00+00:00","dateModified":"2026-10-26T11:11:33+00:00","description":"Ein Anbieterskript formatieren, die sechs lohnenden Suchmuster, die Hostliste f\u00fcr eine CSP herausziehen und warum Festnageln bei einem Container scheitert.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13168.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13168.png","width":1200,"height":630,"caption":"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/tutorial-ein-minifiziertes-fremdskript-lesen-bevor-es-auf-die-seite-darf\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Ein minifiziertes Fremdskript lesen, bevor es auf die Seite darf"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13168"}],"version-history":[{"count":6,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13168\/revisions"}],"predecessor-version":[{"id":26806,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13168\/revisions\/26806"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/29418"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}