{"id":10237,"date":"2026-08-15T00:18:03","date_gmt":"2026-08-14T22:18:03","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/ip-anonymization-masking-tester\/"},"modified":"2026-08-15T00:18:03","modified_gmt":"2026-08-14T22:18:03","slug":"ip-anonymization-masking-tester","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ip-anonymization-masking-tester\/","title":{"rendered":"Test anonimizacji i maskowania adres\u00f3w IP"},"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;\">Skr\u00f3cenie ostatniego oktetu to typowa recepta w kontenerach serwerowych oraz w interfejsach Conversions API Meta, LinkedIn i TikTok. Tutaj wida\u0107 wynik, wielko\u015b\u0107 pozosta\u0142ej grupy oraz przypadki, w kt\u00f3rych maskowanie nigdy nie mia\u0142o przed sob\u0105 prawdziwego adresu.<\/p>\n<p>    <label for=\"ip-eingabe\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adresy IP, po jednym w wierszu<\/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;\">Maskowanie 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\">zachowaj wszystkie cztery oktety (\/32)<\/option><option value=\"24\" selected>odrzu\u0107 ostatni oktet (\/24)<\/option><option value=\"16\">zachowaj dwa oktety (\/16)<\/option><option value=\"8\">zachowaj jeden oktet (\/8)<\/option><option value=\"0\">odrzu\u0107 adres w ca\u0142o\u015bci<\/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;\">Maskowanie 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\">zachowaj pe\u0142ny adres (\/128)<\/option><option value=\"64\">zachowaj cz\u0119\u015b\u0107 sieciow\u0105 (\/64)<\/option><option value=\"56\">zachowaj \/56<\/option><option value=\"48\" selected>zachowaj \/48<\/option><option value=\"32\">zachowaj \/32<\/option><option value=\"0\">odrzu\u0107 adres w ca\u0142o\u015bci<\/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;\">Maskuj<\/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;\">Ustawienie 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;\">Wczytaj przyk\u0142ad<\/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\":\"Skr\u00f3cenie ostatniego oktetu to typowa recepta w kontenerach serwerowych oraz w interfejsach Conversions API Meta, LinkedIn i TikTok. Tutaj wida\u0107 wynik, wielko\u015b\u0107 pozosta\u0142ej grupy oraz przypadki, w kt\u00f3rych maskowanie nigdy nie mia\u0142o przed sob\u0105 prawdziwego adresu.\",\"label_ip\":\"Adresy IP, po jednym w wierszu\",\"ph_ip\":\"203.0.113.45\\n2001:db8:85a3::8a2e:370:7334\",\"label_v4\":\"Maskowanie IPv4\",\"label_v6\":\"Maskowanie IPv6\",\"v4_32\":\"zachowaj wszystkie cztery oktety (\\\/32)\",\"v4_24\":\"odrzu\u0107 ostatni oktet (\\\/24)\",\"v4_16\":\"zachowaj dwa oktety (\\\/16)\",\"v4_8\":\"zachowaj jeden oktet (\\\/8)\",\"v4_0\":\"odrzu\u0107 adres w ca\u0142o\u015bci\",\"v6_128\":\"zachowaj pe\u0142ny adres (\\\/128)\",\"v6_64\":\"zachowaj cz\u0119\u015b\u0107 sieciow\u0105 (\\\/64)\",\"v6_56\":\"zachowaj \\\/56\",\"v6_48\":\"zachowaj \\\/48\",\"v6_32\":\"zachowaj \\\/32\",\"v6_0\":\"odrzu\u0107 adres w ca\u0142o\u015bci\",\"knopf\":\"Maskuj\",\"knopf_ga4\":\"Ustawienie Google Analytics\",\"beispiel\":\"Wczytaj przyk\u0142ad\",\"entfernt\":\"(usuni\u0119ty)\",\"alle\":\"ca\u0142y internet\",\"fehler_leer\":\"Nie podano adresu.\",\"fehler_praefix\":\"Wybrana d\u0142ugo\u015b\u0107 maski wykracza poza dopuszczalny zakres.\",\"h_ergebnis\":\"Wynik\",\"h_nutzlast\":\"Tak opu\u015bci\u0142oby to \u0142adunek\",\"h_einordnung\":\"Co to oznacza\",\"z_menge\":\"%s adres\u00f3w dzieli t\u0119 warto\u015b\u0107 - odrzucono %b bit\u00f3w.\",\"b_privat\":\"Prywatny zakres adres\u00f3w: to w\u0142asny serwer wys\u0142a\u0142 sw\u00f3j adres wewn\u0119trzny, a nie adres odwiedzaj\u0105cego.\",\"b_lokal\":\"Adres p\u0119tli zwrotnej: to sama maszyna, nigdy odwiedzaj\u0105cy.\",\"b_linklokal\":\"Adres link-local, kt\u00f3ry nigdy nie opuszcza w\u0142asnego segmentu.\",\"b_carrier\":\"Zakres NAT operatorskiego: wiele \u0142\u0105czy jednego dostawcy dzieli ten adres.\",\"b_reserviert\":\"Zakres zarezerwowany, nierutowany w internecie.\",\"b_v4inv6\":\"Adres IPv4 w zapisie IPv6. Regu\u0142y maskowania dla IPv6 pozostawiaj\u0105 osadzony adres znacznie d\u0142u\u017cej, ni\u017c mo\u017cna oczekiwa\u0107.\",\"b_ungekuerzt\":\"Tutaj nic nie zamaskowano, adres zapisany jest w ca\u0142o\u015bci.\",\"b_64\":\"Zakres \\\/64 to dok\u0142adnie tyle, ile otrzymuje pojedyncze gospodarstwo domowe. Skracanie do \\\/64 lub mniej nie jest anonimizacj\u0105.\",\"b_port\":\"Do\u0142\u0105czony port zosta\u0142 usuni\u0119ty przed analiz\u0105.\",\"b_ungueltig\":\"to nie jest prawid\u0142owy adres IP\",\"e_hash\":\"Haszowanie adresu IPv4 nie jest anonimizacj\u0105: ca\u0142a przestrze\u0144 to 4,3 miliarda warto\u015bci i mo\u017cna j\u0105 przej\u015b\u0107 w kilka minut, wi\u0119c hasz wskazuje z powrotem na dok\u0142adnie jeden adres.\",\"e_geo\":\"Zakres \\\/24 nadal prowadzi do miasta, cz\u0119sto do dzielnicy. Raportowanie geograficzne przechodzi wi\u0119c przez skr\u00f3cenie niemal bez uszczerbku i o to w nim chodzi.\",\"e_ga4\":\"W GA4 nie ma na to prze\u0142\u0105cznika. Adresy s\u0142u\u017c\u0105 do przypisania geograficznego, a potem s\u0105 odrzucane, dlatego w us\u0142udze nigdzie nie wida\u0107 adresu IP.\",\"e_recht\":\"Skr\u00f3cenie obni\u017ca ryzyko, nie znosi jednak powi\u0105zania z osob\u0105: \\\/24 wraz ze znacznikiem czasu i identyfikatorem przegl\u0105darki wci\u0105\u017c jest na tyle w\u0105skie, \u017ce traktuje si\u0119 je jak dane osobowe.\"};<\/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>Pokazuje, jak wygl\u0105da adres IPv4 lub IPv6 po skr\u00f3ceniu, jak du\u017ca jest pozosta\u0142a grupa adres\u00f3w oraz czy w \u0142adunku znajduje si\u0119 adres prywatny zamiast adresu odwiedzaj\u0105cego.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92035,92151,92136],"class_list":["post-10237","page","type-page","status-publish","hentry","tag-conversion-tracking-pl","tag-prywatnosc-danych-pl-pl","tag-server-side-gtm-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Test anonimizacji i maskowania adres\u00f3w IP - 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\/pl\/narzedzia\/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=\"Test anonimizacji i maskowania adres\u00f3w IP - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Pokazuje, jak wygl\u0105da adres IPv4 lub IPv6 po skr\u00f3ceniu, jak du\u017ca jest pozosta\u0142a grupa adres\u00f3w oraz czy w \u0142adunku znajduje si\u0119 adres prywatny zamiast adresu odwiedzaj\u0105cego.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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\\\/pl\\\/narzedzia\\\/ip-anonymization-masking-tester\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ip-anonymization-masking-tester\\\/\",\"name\":\"Test anonimizacji i maskowania adres\u00f3w IP - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:18:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ip-anonymization-masking-tester\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ip-anonymization-masking-tester\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/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-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Test anonimizacji i maskowania adres\u00f3w IP\"}]},{\"@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":"Test anonimizacji i maskowania adres\u00f3w IP - 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\/pl\/narzedzia\/ip-anonymization-masking-tester\/","og_locale":"en_US","og_type":"article","og_title":"Test anonimizacji i maskowania adres\u00f3w IP - Lukas Wojcik - Blog","og_description":"Pokazuje, jak wygl\u0105da adres IPv4 lub IPv6 po skr\u00f3ceniu, jak du\u017ca jest pozosta\u0142a grupa adres\u00f3w oraz czy w \u0142adunku znajduje si\u0119 adres prywatny zamiast adresu odwiedzaj\u0105cego.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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\/pl\/narzedzia\/ip-anonymization-masking-tester\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ip-anonymization-masking-tester\/","name":"Test anonimizacji i maskowania adres\u00f3w IP - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:18:03+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ip-anonymization-masking-tester\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ip-anonymization-masking-tester\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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-3\/"},{"@type":"ListItem","position":3,"name":"Test anonimizacji i maskowania adres\u00f3w IP"}]},{"@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\/10237","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=10237"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10237\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10237"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}