{"id":15705,"date":"2026-09-06T01:12:22","date_gmt":"2026-09-05T23:12:22","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/third-party-origin-integrity-checker\/"},"modified":"2026-09-06T01:12:22","modified_gmt":"2026-09-05T23:12:22","slug":"third-party-origin-integrity-checker","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/","title":{"rendered":"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Eine Seite ist selten eine einzelne Datei. Skripte, Stilbl\u00e4tter, Bilder und Rahmen kommen von irgendwoher, und jeder Ursprung ist eine Stelle, die die IP-Adresse des Besuchers sieht, eine weitere Verbindung \u2014 und bei Skripten und Stilbl\u00e4ttern Code, der mit allen Rechten der Seite l\u00e4uft. Diese Pr\u00fcfung liest das Markup einmal und sortiert, was sie findet, nach Herkunft, Protokoll und Integrit\u00e4t.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"herkunft-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Seitenadresse<\/label><br \/>\n        <input id=\"herkunft-url\" type=\"text\" value=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Von diesem Server: genau eine Anfrage f\u00fcr die Seite, mit 1,5-MB-Bremse. Keine der nachgeladenen Dateien wird geholt. Es werden keine Cookies gesendet, keine Skripte ausgef\u00fchrt und nichts gespeichert au\u00dfer dem Z\u00e4hlerstand.<\/p>\n<p>    <button id=\"herkunft-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Herkunft pr\u00fcfen<\/button><\/p>\n<div id=\"herkunft-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Grenzen, die zu kennen sich lohnt: Gesehen wird nur, was im ausgelieferten HTML steht. Was ein Skript zur Laufzeit nachl\u00e4dt \u2014 der Normalfall bei Tag-Managern und Einwilligungswerkzeugen \u2014, bleibt unsichtbar, ebenso alles innerhalb eines Rahmens. Zwei Hosts gelten als dieselbe Partei, wenn ihr registrierbarer Name \u00fcbereinstimmt; eine CDN-Unterebene derselben Domain z\u00e4hlt also nicht als fremd.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Eine Seite ist selten eine einzelne Datei. Skripte, Stilbl\u00e4tter, Bilder und Rahmen kommen von irgendwoher, und jeder Ursprung ist eine Stelle, die die IP-Adresse des Besuchers sieht, eine weitere Verbindung \u2014 und bei Skripten und Stilbl\u00e4ttern Code, der mit allen Rechten der Seite l\u00e4uft. Diese Pr\u00fcfung liest das Markup einmal und sortiert, was sie findet, nach Herkunft, Protokoll und Integrit\u00e4t.\",\"label_url\":\"Seitenadresse\",\"datenschutz\":\"Von diesem Server: genau eine Anfrage f\u00fcr die Seite, mit 1,5-MB-Bremse. Keine der nachgeladenen Dateien wird geholt. Es werden keine Cookies gesendet, keine Skripte ausgef\u00fchrt und nichts gespeichert au\u00dfer dem Z\u00e4hlerstand.\",\"knopf\":\"Herkunft pr\u00fcfen\",\"laeuft\":\"Seite wird geholt...\",\"grenze\":\"Grenzen, die zu kennen sich lohnt: Gesehen wird nur, was im ausgelieferten HTML steht. Was ein Skript zur Laufzeit nachl\u00e4dt \u2014 der Normalfall bei Tag-Managern und Einwilligungswerkzeugen \u2014, bleibt unsichtbar, ebenso alles innerhalb eines Rahmens. Zwei Hosts gelten als dieselbe Partei, wenn ihr registrierbarer Name \u00fcbereinstimmt; eine CDN-Unterebene derselben Domain z\u00e4hlt also nicht als fremd.\",\"h_fremde\":\"Fremde Urspr\u00fcnge\",\"tabelle_hinweis\":\"Aktiv hei\u00dft Skript oder Stilblatt: Inhalte, die Code ausf\u00fchren oder das Aussehen bestimmen k\u00f6nnen. Genau die brauchen integrity, und genau die blockieren Browser \u00fcber http vollst\u00e4ndig.\",\"h_befunde\":\"Befunde\",\"sp_host\":\"Host\",\"sp_anzahl\":\"Verweise\",\"sp_aktiv\":\"Aktiv\",\"sp_preconnect\":\"preconnect\",\"art_skript\":\"Skripte\",\"art_blatt\":\"Stilbl\u00e4tter\",\"art_bild\":\"Bilder\",\"art_rahmen\":\"Rahmen\",\"art_medium\":\"Medien\",\"zeile_seite\":\"Seite\",\"zeile_teile\":\"Nachgeladene Teile im Markup\",\"zeile_nach_art\":\"Nach Art\",\"zeile_fremde\":\"Fremde Urspr\u00fcnge\",\"zeile_dauer\":\"Dauer\",\"zeile_limit\":\"Pr\u00fcfungen in dieser Stunde \u00fcbrig\",\"wert_ja\":\"ja\",\"wert_nein\":\"nein\",\"stufe_hoch\":\"Hoch\",\"stufe_mittel\":\"Mittel\",\"stufe_niedrig\":\"Niedrig\",\"stufe_info\":\"Hinweis\",\"stufe_gut\":\"In Ordnung\",\"keine_befunde\":\"Nichts zu melden.\",\"urteil_gut\":\"Die Seite l\u00e4dt von dort, wo sie soll.\",\"urteil_warnung\":\"Die Seite funktioniert, vertraut aber mehr, als sie m\u00fcsste.\",\"urteil_kritisch\":\"Inhalte, die Code ausf\u00fchren k\u00f6nnen, reisen \u00fcber http, oder die Seite selbst ist unverschl\u00fcsselt.\",\"fehler_kein_token\":\"Die Pr\u00fcfung lie\u00df sich nicht starten, weil reCAPTCHA nicht geladen hat.\",\"fehler_captcha\":\"reCAPTCHA hat die Anfrage als automatisiert eingestuft. Ein Neuladen der Seite hilft meist.\",\"fehler_zu_viele\":\"Das Limit von {limit} Pr\u00fcfungen je Stunde f\u00fcr diese Adresse ist erreicht.\",\"fehler_adresse\":\"Diese Adresse l\u00e4sst sich nicht verwenden.\",\"fehler_abruf\":\"Die Seite lie\u00df sich nicht abrufen.\",\"fehler_zaehler\":\"Der Z\u00e4hler ist nicht erreichbar, deshalb wurde nichts gepr\u00fcft.\",\"fehler_pruefdienst\":\"Der reCAPTCHA-Dienst war nicht erreichbar.\",\"fehler_aufbau\":\"Der Dienst ist nicht richtig eingerichtet. Der Fehler liegt auf dieser Seite.\",\"fehler_eingabe\":\"Die Anfrage lie\u00df sich nicht lesen.\",\"fehler_methode\":\"Falsche Anfragemethode.\",\"fehler_netz\":\"Der Dienst war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort lie\u00df sich nicht lesen.\",\"fehler_unbekannt\":\"Es ist etwas schiefgegangen, wof\u00fcr es keine eigene Meldung gibt.\",\"grund_leer\":\"Es wurde nichts eingegeben.\",\"grund_zu_lang\":\"Die Eingabe ist zu lang.\",\"grund_unlesbar\":\"Das ergibt keine Adresse.\",\"grund_schema\":\"Gepr\u00fcft werden nur http- und https-Adressen.\",\"grund_benutzerinfo\":\"Eingaben mit Zugangsdaten darin werden abgewiesen.\",\"grund_kein_punkt\":\"Der Hostname braucht mindestens einen Punkt.\",\"grund_hostform\":\"Erwartet wird ein Hostname, keine IP-Adresse.\",\"grund_port\":\"Gepr\u00fcft werden nur die Ports 80, 443, 8080 und 8443.\",\"grund_gesperrter_bereich\":\"Dieser Host l\u00f6st in ein privates oder reserviertes Netz auf. Solche werden nie abgerufen.\",\"grund_kein_dns\":\"Der Hostname l\u00f6st nicht auf.\",\"grund_abruf\":\"Die Adresse hat nicht geantwortet.\",\"grund_zu_viele_spruenge\":\"Die Adresse leitet zu oft weiter.\",\"befund_status\":\"Die Seite antwortete mit Status {status} || Die nachgeladenen Teile wurden trotzdem aus dem gelieferten Rumpf gelesen, aber eine Seite ohne 200 zeigt selten das, was Besucher sehen.\",\"befund_seite_gekappt\":\"Die Seite ist gr\u00f6\u00dfer als 1,5 MB || Sie wurde bis dahin gelesen. Verweise dahinter sind nicht gesehen worden.\",\"befund_keine_teile\":\"Keine nachgeladenen Teile im ausgelieferten HTML || Entweder ist die Seite wirklich eine einzelne Datei, oder alles wird nachtr\u00e4glich per Skript geladen. Diese Pr\u00fcfung sieht nur das Markup.\",\"befund_gemischt_aktiv\":\"Ein Teil der Art {art} l\u00e4dt \u00fcber http auf einer https-Seite || {url}. Browser blockieren das vollst\u00e4ndig: Die Datei kommt nie an, und die Seite l\u00e4uft ohne sie. Daran ist nichts fein \u2014 das ist die Sorte gemischter Inhalt, die Seiten kaputt macht statt sie nur zu schw\u00e4chen.\",\"befund_gemischt_passiv\":\"{n} passive Teile laden \u00fcber http || Bilder und Medien werden nicht rundweg blockiert, aber Browser stufen die Seite als nicht mehr durchgehend sicher ein und werten teilweise nicht auf. Jedes davon l\u00e4sst sich unterwegs mitlesen und ver\u00e4ndern.\",\"befund_gemischt_passiv_aufgewertet\":\"{n} passive Teile stehen als http da, die CSP wertet sie aber auf || upgrade-insecure-requests macht daraus https, bevor die Anfrage hinausgeht. Das Markup ist unsauber, die Auslieferung nicht.\",\"befund_aufwertung_rettet\":\"Die CSP tr\u00e4gt upgrade-insecure-requests || Damit werden http-Verweise vor der Anfrage auf https umgeschrieben. Das rettet die Auslieferung, nicht das Markup \u2014 und ein Browser ohne CSP-Unterst\u00fctzung sieht das Original.\",\"befund_kein_gemischter_inhalt\":\"Alles l\u00e4dt \u00fcber https || Kein gemischter Inhalt, weder die Sorte, die Browser blockieren, noch die, die sie nur anmerken.\",\"befund_seite_ohne_https\":\"Die Seite selbst wird \u00fcber http ausgeliefert || Alles darauf reist unverschl\u00fcsselt und l\u00e4sst sich unterwegs mitlesen oder \u00e4ndern. Gemischter Inhalt ist hier gar keine Frage mehr, denn gemischt ist nichts: gesch\u00fctzt ist nichts davon.\",\"befund_protokollrelativ\":\"{n} Verweise beginnen mit \\\/\\\/ statt mit einem Protokoll || So schrieb man es, als Seiten noch unter beidem antworteten. Auf einer https-Seite funktioniert es, bedeutet aber auch, dass der Verweis dem folgt, was die Seite gerade verwendet.\",\"befund_ohne_integrity\":\"Ein fremder Teil der Art {art} l\u00e4uft ohne integrity || {url} von {host}. Die Datei wird geladen und mit allen Rechten der Seite ausgef\u00fchrt. Ein integrity-Attribut nagelt ihren Hash fest; eine ver\u00e4nderte Datei l\u00e4uft dann einfach nicht \u2014 das ist der Unterschied zwischen einem \u00fcbernommenen CDN und einer \u00fcbernommenen Seite.\",\"befund_mit_integrity\":\"{n} fremde Teile tragen integrity || Ihr Hash ist festgenagelt, eine ver\u00e4nderte Datei wird abgewiesen statt ausgef\u00fchrt.\",\"befund_keine_fremden_aktiven\":\"Kein Dritter f\u00fchrt auf dieser Seite Code aus || Skripte und Stilbl\u00e4tter kommen s\u00e4mtlich vom eigenen Namen. Eine ganze Klasse von Lieferkettenrisiken f\u00e4llt damit weg.\",\"befund_fremde_ursprunge\":\"{n} fremde Urspr\u00fcnge || {liste}. Jeder davon ist eine Namensaufl\u00f6sung, eine Verbindung und eine Stelle, die die IP-Adresse des Besuchers sieht, bevor irgendetwas vereinbart ist.\",\"befund_fremd_ohne_preconnect\":\"Kein preconnect f\u00fcr {host} || Von dort kommen {n} aktive Teile. Die Verbindung entsteht erst, wenn der Parser den Verweis erreicht; ein preconnect im Kopf beginnt sie fr\u00fcher.\",\"befund_alles_eigen\":\"Alle {n} nachgeladenen Teile kommen vom eigenen Namen || Kein Dritter ist beteiligt, und jede Verbindung steht bereits.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-herkunftcheck.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var ARTEN = ['skript', 'blatt', 'bild', 'rahmen', 'medium'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            var w = (daten && daten[k] !== undefined && daten[k] !== null) ? daten[k] : null;\n            if (w === null) { return m; }\n            if (k === 'art' && T['art_' + w]) { return T['art_' + w]; }\n            return String(w);\n        });\n    }\n    function kurz(url) {\n        var s = String(url || '').replace(\/^https?:\\\/\\\/\/, '');\n        return s.length <= 52 ? s : s.slice(0, 24) + '\u2026' + s.slice(-26);\n    }\n\n    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten &#038;&#038; typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var fremde = liste(a.fremde).map(function (z) {\n            return { host: String(z.host || ''), anzahl: zahl(z.anzahl), aktiv: zahl(z.aktiv), preconnect: z.preconnect === true };\n        });\n        var nachArt = {};\n        if (a.nach_art &#038;&#038; typeof a.nach_art === 'object') {\n            Object.keys(a.nach_art).forEach(function (k) { if (typeof a.nach_art[k] === 'number') { nachArt[k] = a.nach_art[k]; } });\n        }\n        return {\n            fehler: null, url: String(a.url || ''), endurl: String(a.endurl || ''), host: String(a.host || ''),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            teile: zahl(a.teile), nachArt: nachArt, fremde: fremde,\n            befunde: befunde, gruppen: gruppen, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }\n\n    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'herkunftcheck' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.HERKUNFT = { bewerten: bewerten, darstellen: null, text: text, kurz: kurz, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };\n\n    var btn = document.getElementById('herkunft-btn');\n    var out = document.getElementById('herkunft-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined &#038;&#038; txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }\n\n    function tabelle(b) {\n        var huelle = el('div', 'overflow-x: auto; margin: 0 0 6px;');\n        var t = el('table', 'border-collapse: collapse; width: 100%; min-width: 520px; font-size: 0.84rem;');\n        var kopf = el('tr', '');\n        [T.sp_host, T.sp_anzahl, T.sp_aktiv, T.sp_preconnect].forEach(function (n) {\n            kopf.appendChild(el('th', 'text-align: left; padding: 6px 12px 6px 0; color: #8a8a99; font-weight: 700; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.4px; border-bottom: 1px solid var(--border, #2a2a35); white-space: nowrap;', n));\n        });\n        t.appendChild(kopf);\n        b.fremde.forEach(function (z) {\n            var r = el('tr', '');\n            function zelle(txt, stil) { r.appendChild(el('td', 'padding: 7px 12px 7px 0; border-bottom: 1px solid var(--border, #2a2a35); font-family: monospace; color: var(--text-primary, #e8e8ee);' + (stil || ''), txt)); }\n            zelle(z.host, ' word-break: break-all;');\n            zelle(String(z.anzahl !== null ? z.anzahl : '-'), GRAU);\n            zelle(String(z.aktiv !== null ? z.aktiv : '-'), (z.aktiv) ? WARN : GRAU);\n            zelle(z.preconnect ? T.wert_ja : T.wert_nein, z.preconnect ? GUT : GRAU);\n            t.appendChild(r);\n        });\n        huelle.appendChild(t);\n        return huelle;\n    }\n\n    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund &#038;&#038; T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));\n\n        var g = gitter('auto auto');\n        paar(g, T.zeile_seite, b.endurl || b.url, GRAU);\n        paar(g, T.zeile_teile, String(b.teile !== null ? b.teile : '-'), GRAU);\n        var arten = [];\n        ARTEN.forEach(function (a) { if (b.nachArt[a]) { arten.push((T['art_' + a] || a) + ': ' + b.nachArt[a]); } });\n        if (arten.length) { paar(g, T.zeile_nach_art, arten.join(', '), GRAU); }\n        paar(g, T.zeile_fremde, String(b.fremde.length), b.fremde.length ? WARN : GUT);\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);\n\n        if (b.fremde.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_fremde));\n            ziel.appendChild(tabelle(b));\n            ziel.appendChild(el('p', ZELLE + ' margin: 0 0 6px; font-size: 0.8rem;', T.tabelle_hinweis));\n        }\n\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var daten = {};\n                Object.keys(f.daten).forEach(function (n) { daten[n] = (n === 'url') ? kurz(f.daten[n]) : f.daten[n]; });\n                var t = text('befund_' + f.key, daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.HERKUNFT.darstellen = darstellen;\n\n    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('herkunft-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Holt eine Seite einmal und sortiert alles, was sie nachl\u00e4dt, nach drei Fragen: von welchem Host es kommt, ob es auf einer https-Seite \u00fcber http reist und ob ein fremdes Skript oder Stilblatt ein integrity-Attribut tr\u00e4gt. Ein Abruf gen\u00fcgt, weil die Antworten im Markup stehen \u2014 was zugleich hei\u00dft, dass alles unsichtbar bleibt, was ein Skript sp\u00e4ter nachl\u00e4dt.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92265,92759,92292],"class_list":["post-15705","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl-de","tag-web-development-de","tag-web-performance-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut - Lukas Wojcik - Blog<\/title>\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\/werkzeuge\/third-party-origin-integrity-checker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Holt eine Seite einmal und sortiert alles, was sie nachl\u00e4dt, nach drei Fragen: von welchem Host es kommt, ob es auf einer https-Seite \u00fcber http reist und ob ein fremdes Skript oder Stilblatt ein integrity-Attribut tr\u00e4gt. Ein Abruf gen\u00fcgt, weil die Antworten im Markup stehen \u2014 was zugleich hei\u00dft, dass alles unsichtbar bleibt, was ein Skript sp\u00e4ter nachl\u00e4dt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\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\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/third-party-origin-integrity-checker\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/third-party-origin-integrity-checker\\\/\",\"name\":\"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T23:12:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/third-party-origin-integrity-checker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/third-party-origin-integrity-checker\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/third-party-origin-integrity-checker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut\"}]},{\"@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\":\"luky\",\"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\":\"luky\"},\"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":"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut - Lukas Wojcik - Blog","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\/werkzeuge\/third-party-origin-integrity-checker\/","og_locale":"en_US","og_type":"article","og_title":"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut - Lukas Wojcik - Blog","og_description":"Holt eine Seite einmal und sortiert alles, was sie nachl\u00e4dt, nach drei Fragen: von welchem Host es kommt, ob es auf einer https-Seite \u00fcber http reist und ob ein fremdes Skript oder Stilblatt ein integrity-Attribut tr\u00e4gt. Ein Abruf gen\u00fcgt, weil die Antworten im Markup stehen \u2014 was zugleich hei\u00dft, dass alles unsichtbar bleibt, was ein Skript sp\u00e4ter nachl\u00e4dt.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/","name":"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T23:12:22+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/third-party-origin-integrity-checker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"Herkunfts- und Integrit\u00e4tspr\u00fcfer: von wem eine Seite l\u00e4dt und wem sie dabei vertraut"}]},{"@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":"luky","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":"luky"},"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\/pages\/15705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"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=15705"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15705\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15705"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}