{"id":10236,"date":"2026-08-15T00:18:02","date_gmt":"2026-08-14T22:18:02","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/ip-anonymization-masking-tester\/"},"modified":"2026-08-15T00:18:02","modified_gmt":"2026-08-14T22:18:02","slug":"ip-anonymization-masking-tester","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/","title":{"rendered":"IP-Anonymisierung und Maskierung pr\u00fcfen"},"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;\">Das letzte Oktett zu k\u00fcrzen ist das \u00fcbliche Rezept in serverseitigen Containern und in den Conversions APIs von Meta, LinkedIn und TikTok. Hier stehen das Ergebnis, die Gr\u00f6\u00dfe der verbleibenden Gruppe und die F\u00e4lle, in denen die Maskierung nie eine echte Adresse vor sich hatte.<\/p>\n<p>    <label for=\"ip-eingabe\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">IP-Adressen, eine je Zeile<\/label><br \/>\n    <textarea id=\"ip-eingabe\" class=\"form-control\" style=\"width: 100%; height: 120px; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 0.85rem; box-sizing: border-box;\" placeholder=\"203.0.113.45\n2001:db8:85a3::8a2e:370:7334\"><\/textarea><\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 15px; align-items: flex-end;\">\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"ip-v4\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Maskierung f\u00fcr IPv4<\/label><br \/>\n            <select id=\"ip-v4\" 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; font-family: monospace; box-sizing: border-box;\"><option value=\"32\">alle vier Oktette behalten (\/32)<\/option><option value=\"24\" selected>letztes Oktett verwerfen (\/24)<\/option><option value=\"16\">zwei Oktette behalten (\/16)<\/option><option value=\"8\">ein Oktett behalten (\/8)<\/option><option value=\"0\">Adresse ganz verwerfen<\/option><\/select>\n        <\/div>\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"ip-v6\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Maskierung f\u00fcr IPv6<\/label><br \/>\n            <select id=\"ip-v6\" 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; font-family: monospace; box-sizing: border-box;\"><option value=\"128\">vollst\u00e4ndige Adresse behalten (\/128)<\/option><option value=\"64\">Netzanteil behalten (\/64)<\/option><option value=\"56\">\/56 behalten<\/option><option value=\"48\" selected>\/48 behalten<\/option><option value=\"32\">\/32 behalten<\/option><option value=\"0\">Adresse ganz verwerfen<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"ip-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Maskieren<\/button><br \/>\n        <button id=\"ip-ga4\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 12px 20px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Voreinstellung Google Analytics<\/button><br \/>\n        <button id=\"ip-beispiel\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 12px 20px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Beispiel laden<\/button>\n    <\/div>\n<div id=\"ip-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Das letzte Oktett zu k\u00fcrzen ist das \u00fcbliche Rezept in serverseitigen Containern und in den Conversions APIs von Meta, LinkedIn und TikTok. Hier stehen das Ergebnis, die Gr\u00f6\u00dfe der verbleibenden Gruppe und die F\u00e4lle, in denen die Maskierung nie eine echte Adresse vor sich hatte.\",\"label_ip\":\"IP-Adressen, eine je Zeile\",\"ph_ip\":\"203.0.113.45\\n2001:db8:85a3::8a2e:370:7334\",\"label_v4\":\"Maskierung f\u00fcr IPv4\",\"label_v6\":\"Maskierung f\u00fcr IPv6\",\"v4_32\":\"alle vier Oktette behalten (\\\/32)\",\"v4_24\":\"letztes Oktett verwerfen (\\\/24)\",\"v4_16\":\"zwei Oktette behalten (\\\/16)\",\"v4_8\":\"ein Oktett behalten (\\\/8)\",\"v4_0\":\"Adresse ganz verwerfen\",\"v6_128\":\"vollst\u00e4ndige Adresse behalten (\\\/128)\",\"v6_64\":\"Netzanteil behalten (\\\/64)\",\"v6_56\":\"\\\/56 behalten\",\"v6_48\":\"\\\/48 behalten\",\"v6_32\":\"\\\/32 behalten\",\"v6_0\":\"Adresse ganz verwerfen\",\"knopf\":\"Maskieren\",\"knopf_ga4\":\"Voreinstellung Google Analytics\",\"beispiel\":\"Beispiel laden\",\"entfernt\":\"(entfernt)\",\"alle\":\"das ganze Internet\",\"fehler_leer\":\"Es wurde keine Adresse eingegeben.\",\"fehler_praefix\":\"Die gew\u00e4hlte Maskenl\u00e4nge liegt au\u00dferhalb des zul\u00e4ssigen Bereichs.\",\"h_ergebnis\":\"Ergebnis\",\"h_nutzlast\":\"So verlie\u00dfe es die Nutzlast\",\"h_einordnung\":\"Was das bedeutet\",\"z_menge\":\"%s Adressen teilen sich diesen Wert - %b Bit wurden verworfen.\",\"b_privat\":\"Privater Adressbereich: hier hat der eigene Server seine interne Adresse mitgeschickt, nicht die des Besuchers.\",\"b_lokal\":\"R\u00fcckschleifenadresse: das ist die Maschine selbst und nie ein Besucher.\",\"b_linklokal\":\"Verbindungslokale Adresse, die das eigene Segment nie verl\u00e4sst.\",\"b_carrier\":\"Bereich f\u00fcr providerseitiges NAT: viele Anschl\u00fcsse eines Anbieters teilen sich diese Adresse.\",\"b_reserviert\":\"Reservierter Bereich, der im Internet nicht geroutet wird.\",\"b_v4inv6\":\"IPv4-Adresse in IPv6-Schreibweise. Die Maskierungsregeln f\u00fcr IPv6 lassen die eingebettete Adresse deutlich l\u00e4nger stehen als erwartet.\",\"b_ungekuerzt\":\"Hier wurde nichts maskiert, die Adresse steht vollst\u00e4ndig da.\",\"b_64\":\"Ein \\\/64 ist genau das, was ein einzelner Haushalt bekommt. Auf \\\/64 oder weniger zu k\u00fcrzen ist keine Anonymisierung.\",\"b_port\":\"Ein angeh\u00e4ngter Port wurde vor der Auswertung entfernt.\",\"b_ungueltig\":\"keine g\u00fcltige IP-Adresse\",\"e_hash\":\"Eine IPv4-Adresse zu hashen ist keine Anonymisierung: der gesamte Raum umfasst 4,3 Milliarden Werte und l\u00e4sst sich in Minuten durchprobieren, ein Hash zeigt also wieder auf genau eine Adresse.\",\"e_geo\":\"Ein \\\/24 f\u00fchrt weiterhin auf eine Stadt, oft auf einen Stadtteil. Die geografische Auswertung \u00fcbersteht die K\u00fcrzung deshalb nahezu unbeschadet, und genau darum geht es dabei.\",\"e_ga4\":\"In GA4 gibt es daf\u00fcr keinen Schalter. Adressen dienen der geografischen Zuordnung und werden danach verworfen, deshalb taucht in der Property nirgends eine IP auf.\",\"e_recht\":\"Die K\u00fcrzung senkt das Risiko, sie hebt den Personenbezug nicht auf: ein \\\/24 mit Zeitstempel und Browserkennung ist immer noch eng genug, um als personenbezogenes Datum behandelt zu werden.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    \/\/ Adressbereiche, die nie ein Besucher aus dem Netz sein koennen. Steht\n    \/\/ so etwas in einer CAPI-Nutzlast, hat der eigene Server seine eigene\n    \/\/ Adresse mitgeschickt statt der des Besuchers.\n    const V4_BEREICHE = [\n        { netz: [10, 0, 0, 0], praefix: 8, art: 'privat' },\n        { netz: [172, 16, 0, 0], praefix: 12, art: 'privat' },\n        { netz: [192, 168, 0, 0], praefix: 16, art: 'privat' },\n        { netz: [127, 0, 0, 0], praefix: 8, art: 'lokal' },\n        { netz: [169, 254, 0, 0], praefix: 16, art: 'linklokal' },\n        { netz: [100, 64, 0, 0], praefix: 10, art: 'carrier' },\n        { netz: [0, 0, 0, 0], praefix: 8, art: 'reserviert' }\n    ];<\/p>\n<p>    function ipv4Lesen(text) {\n        const teile = String(text).trim().split('.');\n        if (teile.length !== 4) { return null; }\n        const zahlen = [];\n        for (let i = 0; i < 4; i++) {\n            if (!\/^[0-9]{1,3}$\/.test(teile[i])) { return null; }\n            const wert = parseInt(teile[i], 10);\n            if (wert > 255) { return null; }\n            zahlen.push(wert);\n        }\n        return zahlen;\n    }<\/p>\n<p>    function ipv6Lesen(text) {\n        let s = String(text).trim().toLowerCase();\n        const zone = s.indexOf('%');\n        if (zone !== -1) { s = s.slice(0, zone); }\n        if (s.indexOf(':') === -1) { return null; }<\/p>\n<p>        \/\/ In IPv6 eingebettete IPv4-Adresse, etwa ::ffff:192.0.2.7\n        const letzter = s.lastIndexOf(':');\n        const schwanz = s.slice(letzter + 1);\n        if (schwanz.indexOf('.') !== -1) {\n            const v4 = ipv4Lesen(schwanz);\n            if (!v4) { return null; }\n            s = s.slice(0, letzter + 1)\n                + ((v4[0] * 256 + v4[1]).toString(16)) + ':'\n                + ((v4[2] * 256 + v4[3]).toString(16));\n        }<\/p>\n<p>        const teile = s.split('::');\n        if (teile.length > 2) { return null; }\n        const links = teile[0] === '' ? [] : teile[0].split(':');\n        const rechts = teile.length === 2 ? (teile[1] === '' ? [] : teile[1].split(':')) : [];\n        let gruppen;\n        if (teile.length === 1) {\n            if (links.length !== 8) { return null; }\n            gruppen = links;\n        } else {\n            const fehlend = 8 - links.length - rechts.length;\n            if (fehlend < 1) { return null; }\n            gruppen = links.slice();\n            for (let i = 0; i < fehlend; i++) { gruppen.push('0'); }\n            gruppen = gruppen.concat(rechts);\n        }\n        if (gruppen.length !== 8) { return null; }\n        const zahlen = [];\n        for (let i = 0; i < 8; i++) {\n            if (!\/^[0-9a-f]{1,4}$\/.test(gruppen[i])) { return null; }\n            zahlen.push(parseInt(gruppen[i], 16));\n        }\n        return zahlen;\n    }\n\n    function ipv6Text(gruppen) {\n        \/\/ Laengste Folge aus Nullen suchen und durch :: ersetzen.\n        let bestStart = -1;\n        let bestLaenge = 0;\n        let start = -1;\n        let laenge = 0;\n        for (let i = 0; i < 8; i++) {\n            if (gruppen[i] === 0) {\n                if (start === -1) { start = i; laenge = 0; }\n                laenge++;\n                if (laenge > bestLaenge) { bestLaenge = laenge; bestStart = start; }\n            } else {\n                start = -1;\n                laenge = 0;\n            }\n        }\n        const teile = gruppen.map(function (g) { return g.toString(16); });\n        if (bestLaenge < 2) { return teile.join(':'); }\n        const vorn = teile.slice(0, bestStart).join(':');\n        const hinten = teile.slice(bestStart + bestLaenge).join(':');\n        return vorn + '::' + hinten;\n    }\n\n    function maskeV4(zahlen, praefix) {\n        const raus = [];\n        for (let i = 0; i < 4; i++) {\n            const anfang = i * 8;\n            if (anfang >= praefix) { raus.push(0); continue; }\n            const behalten = Math.min(8, praefix - anfang);\n            if (behalten >= 8) { raus.push(zahlen[i]); continue; }\n            raus.push(zahlen[i] & ((255 << (8 - behalten)) &#038; 255));\n        }\n        return raus;\n    }\n\n    function maskeV6(gruppen, praefix) {\n        const raus = [];\n        for (let i = 0; i < 8; i++) {\n            const anfang = i * 16;\n            if (anfang >= praefix) { raus.push(0); continue; }\n            const behalten = Math.min(16, praefix - anfang);\n            if (behalten >= 16) { raus.push(gruppen[i]); continue; }\n            raus.push(gruppen[i] & ((0xFFFF << (16 - behalten)) &#038; 0xFFFF));\n        }\n        return raus;\n    }\n\n    function inBereich(zahlen, netz, praefix) {\n        const a = maskeV4(zahlen, praefix);\n        const b = maskeV4(netz, praefix);\n        return a[0] === b[0] &#038;&#038; a[1] === b[1] &#038;&#038; a[2] === b[2] &#038;&#038; a[3] === b[3];\n    }\n\n    function menge(bits) {\n        \/\/ Wie viele Adressen deckt der verbliebene Rest ab?\n        if (bits <= 0) { return '1'; }\n        if (bits <= 53) {\n            const wert = Math.pow(2, bits);\n            return wert.toLocaleString('en-US').replace(\/,\/g, ' ');\n        }\n        return '2^' + bits;\n    }\n\n    function eineAdresse(roh, praefixV4, praefixV6) {\n        const eintrag = {\n            eingabe: String(roh).trim(),\n            art: '',\n            gueltig: false,\n            maskiert: '',\n            praefix: 0,\n            bitsWeg: 0,\n            menge: '',\n            befunde: []\n        };\n        if (eintrag.eingabe === '') { return null; }\n\n        \/\/ Ein angehaengter Port oder eine Klammerung stoert die Auswertung.\n        let text = eintrag.eingabe;\n        if (text.charAt(0) === '[') {\n            const zu = text.indexOf(']');\n            if (zu !== -1) { text = text.slice(1, zu); }\n        } else if (text.indexOf(':') !== -1 &#038;&#038; text.indexOf('.') !== -1 &#038;&#038; text.split(':').length === 2) {\n            text = text.split(':')[0];\n            eintrag.befunde.push(T.b_port);\n        }\n\n        const v4 = ipv4Lesen(text);\n        if (v4) {\n            eintrag.art = 'IPv4';\n            eintrag.gueltig = true;\n            eintrag.praefix = praefixV4;\n            eintrag.bitsWeg = 32 - praefixV4;\n            eintrag.maskiert = praefixV4 === 0 ? T.entfernt : maskeV4(v4, praefixV4).join('.');\n            eintrag.menge = praefixV4 === 0 ? T.alle : menge(32 - praefixV4);\n            V4_BEREICHE.forEach(function (b) {\n                if (inBereich(v4, b.netz, b.praefix)) {\n                    eintrag.befunde.push(T['b_' + b.art] || b.art);\n                }\n            });\n            if (praefixV4 === 32) { eintrag.befunde.push(T.b_ungekuerzt); }\n            return eintrag;\n        }\n\n        const v6 = ipv6Lesen(text);\n        if (v6) {\n            eintrag.art = 'IPv6';\n            eintrag.gueltig = true;\n            eintrag.praefix = praefixV6;\n            eintrag.bitsWeg = 128 - praefixV6;\n            eintrag.maskiert = praefixV6 === 0 ? T.entfernt : ipv6Text(maskeV6(v6, praefixV6));\n            eintrag.menge = praefixV6 === 0 ? T.alle : menge(128 - praefixV6);\n            const erstes = v6[0];\n            if (v6[0] === 0 &#038;&#038; v6[1] === 0 &#038;&#038; v6[2] === 0 &#038;&#038; v6[3] === 0 &#038;&#038; v6[4] === 0 &#038;&#038; v6[5] === 0xffff) {\n                eintrag.befunde.push(T.b_v4inv6);\n            }\n            if ((erstes &#038; 0xfe00) === 0xfc00) { eintrag.befunde.push(T.b_privat); }\n            if ((erstes &#038; 0xffc0) === 0xfe80) { eintrag.befunde.push(T.b_linklokal); }\n            if (ipv6Text(v6) === '::1') { eintrag.befunde.push(T.b_lokal); }\n            if (praefixV6 === 128) { eintrag.befunde.push(T.b_ungekuerzt); }\n            if (praefixV6 >= 64) { eintrag.befunde.push(T.b_64); }\n            return eintrag;\n        }<\/p>\n<p>        eintrag.befunde.push(T.b_ungueltig);\n        return eintrag;\n    }<\/p>\n<p>    function auswerten(text, praefixV4, praefixV6) {\n        const ergebnis = { ok: false, fehler: '', eintraege: [], anzahl: 0, ungueltig: 0 };\n        const zeilen = String(text === undefined || text === null ? '' : text).split(\/[\\r\\n,;]+\/);\n        const p4 = parseInt(praefixV4, 10);\n        const p6 = parseInt(praefixV6, 10);\n        if (!isFinite(p4) || p4 < 0 || p4 > 32 || !isFinite(p6) || p6 < 0 || p6 > 128) {\n            ergebnis.fehler = T.fehler_praefix;\n            return ergebnis;\n        }<\/p>\n<p>        zeilen.forEach(function (zeile) {\n            const eintrag = eineAdresse(zeile, p4, p6);\n            if (eintrag) { ergebnis.eintraege.push(eintrag); }\n        });<\/p>\n<p>        if (!ergebnis.eintraege.length) {\n            ergebnis.fehler = T.fehler_leer;\n            return ergebnis;\n        }\n        ergebnis.anzahl = ergebnis.eintraege.length;\n        ergebnis.ungueltig = ergebnis.eintraege.filter(function (e) { return !e.gueltig; }).length;\n        ergebnis.ok = true;\n        return ergebnis;\n    }<\/p>\n<p>    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.IP = {\n            auswerten: auswerten,\n            ipv4Lesen: ipv4Lesen,\n            ipv6Lesen: ipv6Lesen,\n            ipv6Text: ipv6Text,\n            maskeV4: maskeV4,\n            maskeV6: maskeV6\n        };\n    }<\/p>\n<p>    \/\/ --- Anbindung an das Dokument ---<\/p>\n<p>    const btn = document.getElementById('ip-btn');\n    const out = document.getElementById('ip-ergebnis');\n    const feld = document.getElementById('ip-eingabe');\n    const v4Feld = document.getElementById('ip-v4');\n    const v6Feld = document.getElementById('ip-v6');\n    const ga4Btn = document.getElementById('ip-ga4');\n    const beispielBtn = document.getElementById('ip-beispiel');\n    if (!btn || !out || !feld || !v4Feld || !v6Feld || !ga4Btn || !beispielBtn) { return; }<\/p>\n<p>    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';<\/p>\n<p>    function el(tag, css, text) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (text !== undefined && text !== null) { knoten.textContent = text; }\n        return knoten;\n    }<\/p>\n<p>    function meldung(text) {\n        out.textContent = '';\n        out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid var(--accent, #7ee787); color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', text));\n    }<\/p>\n<p>    function zeigen(erg) {\n        out.textContent = '';<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_ergebnis));\n        const kasten = el('div', KASTEN);\n        erg.eintraege.forEach(function (e) {\n            const z = el('div', 'padding: 9px 0; border-bottom: 1px solid var(--border, #2a2a35);');\n            const kopf = el('div', 'display: flex; gap: 14px; flex-wrap: wrap; align-items: baseline;');\n            kopf.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-family: monospace; min-width: 160px;', e.eingabe));\n            kopf.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0);', '\u2192'));\n            kopf.appendChild(el('span', 'color: ' + (e.gueltig ? 'var(--accent, #7ee787)' : '#ffb86c') + '; font-family: monospace; font-weight: 700;', e.gueltig ? e.maskiert : T.b_ungueltig));\n            if (e.gueltig) {\n                kopf.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.8rem;', e.art + ' \/' + e.praefix));\n            }\n            z.appendChild(kopf);\n            if (e.gueltig) {\n                z.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; padding-top: 3px;', T.z_menge.replace('%s', e.menge).replace('%b', String(e.bitsWeg))));\n            }\n            e.befunde.forEach(function (b) {\n                z.appendChild(el('div', 'color: #ffb86c; font-size: 0.82rem; padding-top: 3px;', b));\n            });\n            kasten.appendChild(z);\n        });\n        out.appendChild(kasten);<\/p>\n<p>        \/\/ Nutzlast, wie sie an eine Conversions API ginge.\n        const ersteGueltige = erg.eintraege.filter(function (e) { return e.gueltig; })[0];\n        if (ersteGueltige) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_nutzlast));\n            const code = el('pre', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); padding: 16px; border-radius: 6px; overflow-x: auto; font-family: monospace; font-size: 0.85rem; line-height: 1.5; white-space: pre; margin-bottom: 18px;');\n            const wert = ersteGueltige.praefix === 0 ? 'null' : '\"' + ersteGueltige.maskiert + '\"';\n            code.textContent = '{\\n  \"event_name\": \"Purchase\",\\n  \"user_data\": {\\n    \"client_ip_address\": ' + wert + ',\\n    \"client_user_agent\": \"...\"\\n  }\\n}';\n            out.appendChild(code);\n        }<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_einordnung));\n        const hinweise = el('div', KASTEN);\n        [T.e_hash, T.e_geo, T.e_ga4, T.e_recht].forEach(function (text) {\n            hinweise.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.88rem; line-height: 1.6; padding: 5px 0;', text));\n        });\n        out.appendChild(hinweise);\n    }<\/p>\n<p>    btn.addEventListener('click', function () {\n        const erg = auswerten(feld.value, v4Feld.value, v6Feld.value);\n        if (!erg.ok) { meldung(erg.fehler); return; }\n        zeigen(erg);\n    });<\/p>\n<p>    ga4Btn.addEventListener('click', function () {\n        v4Feld.value = '24';\n        v6Feld.value = '48';\n        btn.click();\n    });<\/p>\n<p>    beispielBtn.addEventListener('click', function () {\n        feld.value = '203.0.113.45\\n198.51.100.7\\n192.168.1.45\\n2001:db8:85a3:1319:8a2e:370:7334:1\\n::ffff:192.0.2.128';\n        btn.click();\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zeigt, wie eine IPv4- oder IPv6-Adresse nach der K\u00fcrzung aussieht, wie gro\u00df die verbleibende Gruppe von Adressen ist und ob in einer Nutzlast statt der Besucheradresse eine private Adresse steckt.<\/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":[92023,92265,92148],"class_list":["post-10236","page","type-page","status-publish","hentry","tag-conversion-tracking-de","tag-prywatnosc-danych-pl-de","tag-server-side-gtm-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>IP-Anonymisierung und Maskierung pr\u00fcfen - 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\/ip-anonymization-masking-tester\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IP-Anonymisierung und Maskierung pr\u00fcfen - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Zeigt, wie eine IPv4- oder IPv6-Adresse nach der K\u00fcrzung aussieht, wie gro\u00df die verbleibende Gruppe von Adressen ist und ob in einer Nutzlast statt der Besucheradresse eine private Adresse steckt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/\" \/>\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<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/ip-anonymization-masking-tester\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/ip-anonymization-masking-tester\\\/\",\"name\":\"IP-Anonymisierung und Maskierung pr\u00fcfen - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:18:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/ip-anonymization-masking-tester\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/ip-anonymization-masking-tester\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/ip-anonymization-masking-tester\\\/#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\":\"IP-Anonymisierung und Maskierung pr\u00fcfen\"}]},{\"@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":"IP-Anonymisierung und Maskierung pr\u00fcfen - 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\/ip-anonymization-masking-tester\/","og_locale":"en_US","og_type":"article","og_title":"IP-Anonymisierung und Maskierung pr\u00fcfen - Lukas Wojcik - Blog","og_description":"Zeigt, wie eine IPv4- oder IPv6-Adresse nach der K\u00fcrzung aussieht, wie gro\u00df die verbleibende Gruppe von Adressen ist und ob in einer Nutzlast statt der Besucheradresse eine private Adresse steckt.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/","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","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/","name":"IP-Anonymisierung und Maskierung pr\u00fcfen - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:18:02+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/ip-anonymization-masking-tester\/#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":"IP-Anonymisierung und Maskierung pr\u00fcfen"}]},{"@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\/10236","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=10236"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10236\/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=10236"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}