{"id":15562,"date":"2026-09-05T14:19:44","date_gmt":"2026-09-05T12:19:44","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/connection-mirror-what-the-server-sees\/"},"modified":"2026-09-05T14:19:44","modified_gmt":"2026-09-05T12:19:44","slug":"connection-mirror-what-the-server-sees","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/connection-mirror-what-the-server-sees\/","title":{"rendered":"Verbindungsspiegel: Was der Server sieht"},"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;\">Jede Anfrage tr\u00e4gt mehr als eine Seitenadresse. Bevor eine Zeile JavaScript l\u00e4uft, kennt der Server die IP-Adresse und wessen Netz sie ist, welche TLS-Version und welcher Cipher ausgehandelt wurden, welche Sprachen der Browser bevorzugt, ob er ein Global-Privacy-Control-Signal sendet und, in Chromium, die Client Hints, die den User-Agent-String abgel\u00f6st haben. Dieses Werkzeug bittet diesen Server, genau das f\u00fcr die aktuelle Verbindung zu berichten, und stellt es neben das, was der Browser \u00fcber sich selbst sagt. Wo beides auseinandergeht, steckt meist eine Erweiterung, ein Proxy oder ein VPN dazwischen.<\/p>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Die Anfrage geht nur an diesen Server; gespeichert wird nichts au\u00dfer dem st\u00fcndlichen Z\u00e4hler, und die Antwort erscheint nur hier. Cookie-Werte und Autorisierungskopfzeilen werden nie zur\u00fcckgegeben, nur Cookie-Namen. Die Reverse-DNS-Abfrage und eine RDAP-Anfrage zum Netzinhaber laufen auf diesem Server.<\/p>\n<p>    <button id=\"mi-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;\">Zeigen, was dieser Server sieht<\/button><\/p>\n<div id=\"mi-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Grenzen, die dazugeh\u00f6ren: Gezeigt werden die Kopfzeilen einer Hintergrundanfrage (fetch), die weniger Sec-Fetch- und Accept-Werte tr\u00e4gt als ein Seitenaufruf; die HTTP-Version ist die, die dieser Server aushandelt, nicht das Beste, was der Browser kann; der Netzinhaber stammt aus der regionalen Registry und nennt den Anbieter, keine Person; und der Hosting-Hinweis ist eine Heuristik auf dem Netznamen.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Jede Anfrage tr\u00e4gt mehr als eine Seitenadresse. Bevor eine Zeile JavaScript l\u00e4uft, kennt der Server die IP-Adresse und wessen Netz sie ist, welche TLS-Version und welcher Cipher ausgehandelt wurden, welche Sprachen der Browser bevorzugt, ob er ein Global-Privacy-Control-Signal sendet und, in Chromium, die Client Hints, die den User-Agent-String abgel\u00f6st haben. Dieses Werkzeug bittet diesen Server, genau das f\u00fcr die aktuelle Verbindung zu berichten, und stellt es neben das, was der Browser \u00fcber sich selbst sagt. Wo beides auseinandergeht, steckt meist eine Erweiterung, ein Proxy oder ein VPN dazwischen.\",\"datenschutz\":\"Die Anfrage geht nur an diesen Server; gespeichert wird nichts au\u00dfer dem st\u00fcndlichen Z\u00e4hler, und die Antwort erscheint nur hier. Cookie-Werte und Autorisierungskopfzeilen werden nie zur\u00fcckgegeben, nur Cookie-Namen. Die Reverse-DNS-Abfrage und eine RDAP-Anfrage zum Netzinhaber laufen auf diesem Server.\",\"knopf\":\"Zeigen, was dieser Server sieht\",\"laeuft\":\"Der Server wird gefragt...\",\"grenze\":\"Grenzen, die dazugeh\u00f6ren: Gezeigt werden die Kopfzeilen einer Hintergrundanfrage (fetch), die weniger Sec-Fetch- und Accept-Werte tr\u00e4gt als ein Seitenaufruf; die HTTP-Version ist die, die dieser Server aushandelt, nicht das Beste, was der Browser kann; der Netzinhaber stammt aus der regionalen Registry und nennt den Anbieter, keine Person; und der Hosting-Hinweis ist eine Heuristik auf dem Netznamen.\",\"h_verbindung\":\"Verbindung\",\"zeile_ip\":\"Adresse\",\"zeile_port\":\"Port\",\"zeile_ptr\":\"Reverse-DNS\",\"zeile_netz\":\"Netz\",\"zeile_tls\":\"TLS\",\"zeile_http\":\"HTTP-Version\",\"zeile_cookies\":\"Gesendete Cookies (Namen)\",\"zeile_dauer\":\"Dauer\",\"zeile_limit\":\"Aufrufe in dieser Stunde noch\",\"familie_4\":\"IPv4\",\"familie_6\":\"IPv6\",\"wert_keiner\":\"keiner\",\"h_kopf\":\"Anfragekopfzeilen, wie empfangen ({n})\",\"h_vergleich\":\"Server gegen Browser\",\"spalte_merkmal\":\"Merkmal\",\"server_sieht\":\"Server sieht\",\"browser_sagt\":\"Browser sagt\",\"gleich\":\"gleich\",\"verschieden\":\"verschieden\",\"v_sprache\":\"Bevorzugte Sprache\",\"v_gpc\":\"Global Privacy Control\",\"v_ua\":\"User-Agent\",\"v_zeitzone\":\"Land des Netzes \\\/ Zeitzone\",\"v_plattform\":\"Plattform\",\"ja\":\"ja\",\"nein\":\"nein\",\"h_befunde\":\"Befunde\",\"stufe_hoch\":\"Hoch\",\"stufe_mittel\":\"Mittel\",\"stufe_niedrig\":\"Niedrig\",\"stufe_info\":\"Hinweis\",\"stufe_gut\":\"In Ordnung\",\"keine_befunde\":\"Nichts zu berichten.\",\"fehler_zu_viele\":\"Die Grenze von {limit} Aufrufen je Stunde f\u00fcr diese Adresse ist erreicht.\",\"fehler_zaehler\":\"Der Z\u00e4hler ist nicht erreichbar, deshalb wurde nichts gepr\u00fcft.\",\"fehler_methode\":\"Falsche Anfragemethode.\",\"fehler_netz\":\"Der Dienst war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort war nicht lesbar.\",\"fehler_unbekannt\":\"Etwas ging schief, wof\u00fcr es keine eigene Meldung gibt.\",\"befund_ipv6\":\"Verbunden \u00fcber IPv6: {ip} || Die Adresse stammt aus der IPv6-Zuteilung des Anbieters. Viele Anbieter vergeben regelm\u00e4\u00dfig ein neues Pr\u00e4fix; der Interface-Teil kann trotzdem lange gleich bleiben.\",\"befund_ipv4\":\"Verbunden \u00fcber IPv4: {ip} || Entweder hat der Anbieter noch kein IPv6, oder der Browser hat f\u00fcr diesen Host IPv4 gew\u00e4hlt. Hinter Carrier-Grade-NAT teilen sich viele Kunden eine solche Adresse.\",\"befund_adresse_unbekannt\":\"Keine Client-Adresse lesbar || Der Server hat keine brauchbare Gegenadresse gesehen, was auf einen falsch eingerichteten Proxy deutet.\",\"befund_adresse_privat\":\"Die Adresse ist privat: {ip} || Die Anfrage kam aus einem lokalen Netz oder \u00fcber einen Proxy, der die Herkunft verbirgt, bei diesem Server an. Reverse-DNS und Netzabfrage entfallen bei privaten Adressen.\",\"befund_ptr\":\"Reverse-DNS: {ptr} || Der Name des Anbieters f\u00fcr diese Adresse. Er verr\u00e4t oft Anbieter, Region und ob die Leitung privat oder gesch\u00e4ftlich ist, und jede Seite kann ihn sehen.\",\"befund_ptr_fehlt\":\"Kein Reverse-DNS-Name || Der Anbieter hat f\u00fcr diese Adresse keinen PTR-Eintrag gesetzt. Daran ist nichts falsch; Seiten haben nur einen Hinweis weniger.\",\"befund_netz\":\"Netz: {name}, {org} ({land}) || Wem die Adresse zugeteilt ist, aus der regionalen Registry. Das ist die grobe Verortung, die jede Seite allein aus der Adresse ableiten kann.\",\"befund_rechenzentrum\":\"Das Netz geh\u00f6rt einem Hosting- oder Cloud-Anbieter: {anbieter} || Typisch f\u00fcr ein VPN, einen Proxy oder einen automatisierten Client. Seiten, die Besucher bewerten, behandeln solche Adressen anders als Privatanschl\u00fcsse.\",\"befund_proxy_kopf\":\"Proxy-Kopfzeile vorhanden: {wert} || Eine Via-, Forwarded- oder X-Forwarded-For-Kopfzeile sagt, dass etwas zwischen Browser und Server die Anfrage umgeschrieben hat. Was darin steht, hat diese Station erg\u00e4nzt, nicht der Browser.\",\"befund_tls13\":\"TLS 1.3 mit {cipher} || Die aktuelle Version: Handshake in einer Runde, nur Forward Secrecy, und das Serverzertifikat ist auf der Leitung verschl\u00fcsselt.\",\"befund_tls12\":\"TLS 1.2 mit {cipher} || Noch in Ordnung, aber Browser oder eine Zwischenstation haben kein 1.3 ausgehandelt. Aktuelle Browser tun das; ein Firmen-Proxy, der Verkehr inspiziert, bleibt oft bei 1.2.\",\"befund_tls_alt\":\"Alte TLS-Version: {protokoll} || TLS 1.0 und 1.1 sind abgek\u00fcndigt, aktuelle Browser verweigern sie. Etwas Altes steckt dazwischen.\",\"befund_kein_tls\":\"Kein TLS || Die Anfrage kam im Klartext an. Alles auf dieser Seite, Kopfzeilen eingeschlossen, war unterwegs lesbar.\",\"befund_tls_unbekannt\":\"TLS-Details nicht exportiert || Die Verbindung ist verschl\u00fcsselt, aber der Server hat die Protokolldetails f\u00fcr diese Anfrage nicht exportiert.\",\"befund_http_version\":\"HTTP-Version {version} || Die Version, die dieser Server f\u00fcr diese Anfrage ausgehandelt hat. Sie h\u00e4ngt davon ab, was dieser Server anbietet, nicht nur vom Browser.\",\"befund_gpc\":\"Global Privacy Control ist gesetzt (Sec-GPC: 1) || Browser oder Erweiterung bitten, personenbezogene Daten nicht zu verkaufen oder zu teilen. Nach den Datenschutzgesetzen Kaliforniens und Colorados m\u00fcssen Seiten es beachten; in der EU ist es ein Signal ohne rechtliche Definition, aber eine klare Willensbekundung.\",\"befund_gpc_fehlt\":\"Kein Global-Privacy-Control-Signal || Der Browser sendet keine Sec-GPC-Kopfzeile. Firefox und Brave k\u00f6nnen sie senden, Chrome nicht; Erweiterungen wie Privacy Badger erg\u00e4nzen sie.\",\"befund_dnt\":\"Do Not Track: {wert} || Das alte Widerspruchssignal. Nie rechtlich bindend, von den meisten Seiten ignoriert, 2024 aus Firefox entfernt. Es zu senden f\u00fcgt dem Fingerabdruck trotzdem ein Bit hinzu.\",\"befund_save_data\":\"Save-Data: {wert} || Der Browser bittet um sparsamen Datenverbrauch, meist weil ein Datensparmodus an ist. Seiten d\u00fcrfen kleinere Bilder und weniger Skripte liefern.\",\"befund_ua_fehlt\":\"Keine User-Agent-Kopfzeile || Ungew\u00f6hnlich f\u00fcr einen Browser; automatisierte Clients senden manchmal keine.\",\"befund_ua\":\"User-Agent: {ua} || Die Zeichenkette, die jede Seite bekommt. In Chromium ist sie eingefroren (reduziert) und verr\u00e4t weder die genaue Version noch das Ger\u00e4temodell.\",\"befund_ua_reduziert\":\"Reduzierter User-Agent-String || Die Version lautet x.0.0.0 und die Plattform ist generisch: die User-Agent-Reduktion von Chromium. Die genauen Werte sind in die Client Hints gewandert, die eine Seite anfordern muss.\",\"befund_ua_automat\":\"Der User-Agent sieht automatisiert aus || Namen wie bot, curl oder HeadlessChrome kennzeichnen den Client als Skript oder Crawler.\",\"befund_client_hints\":\"Client Hints: {ua}, Plattform {plattform}, mobil {mobil} || Chromium sendet Browsermarke, Hauptversion, Plattform und ein Mobil-Flag unaufgefordert. Alles dar\u00fcber hinaus (Architektur, Modell, volle Version) erst, nachdem die Seite es per Accept-CH angefordert hat.\",\"befund_client_hints_hoch\":\"Hochentropie-Client-Hints unaufgefordert gesendet: {liste} || Diese sollen nur nach Anforderung durch die Seite gesendet werden. Hier zu sehen hei\u00dft: Browser oder Erweiterung senden sie von sich aus, was den Fingerabdruck vergr\u00f6\u00dfert.\",\"befund_client_hints_fehlen\":\"Keine Client Hints || Firefox und Safari senden keine Sec-CH-UA-Kopfzeilen; der User-Agent-String ist alles, was eine Seite vor dem ersten Skript bekommt.\",\"befund_fetch_metadaten\":\"Fetch-Metadaten: site {site}, mode {mode}, dest {dest} || Der Browser sagt dem Server, woher die Anfrage kommt und wof\u00fcr sie ist. Server nutzen das, um seiten\u00fcbergreifende Anfragen abzuweisen, bevor Inhalt entsteht.\",\"befund_sprache\":\"Bevorzugte Sprachen: {liste} || Die Accept-Language-Kopfzeile, in Reihenfolge. Seiten w\u00e4hlen daraus eine Sprache; sie geh\u00f6rt zugleich zu den identifizierendsten Kopfzeilen, besonders mit mehreren Eintr\u00e4gen.\",\"befund_sprache_viele\":\"{n} Sprachen aufgef\u00fchrt || Eine lange Accept-Language-Liste ist selten und deshalb identifizierend. Zwei Eintr\u00e4ge sind \u00fcblich; f\u00fcnf sind ein Fingerabdruck.\",\"befund_sprache_fehlt\":\"Keine Accept-Language-Kopfzeile || Ungew\u00f6hnlich f\u00fcr einen Browser.\",\"befund_kodierung\":\"Angenommene Kodierungen: {liste} (Brotli {br}, zstd {zstd}) || Welche Kompressionen der Browser entpacken kann. Jeder aktuelle Browser nimmt Brotli an; zstd kam 2024 in Chrome und Firefox.\",\"befund_referer\":\"Referer: {wert} || Die Seite, von der diese Anfrage kam, soweit die Referrer-Policy es erlaubt.\",\"befund_entropie\":\"{n} Kopfzeilen jenseits des User-Agents tragen identifizierende Details: {liste} || Eine grobe Z\u00e4hlung dessen, was ein Fingerabdruck allein aus den Kopfzeilen ziehen k\u00f6nnte, bevor ein Skript l\u00e4uft.\",\"befund_b_sprache_abweichend\":\"Sprache weicht ab: Server sieht {server}, Browser meldet {browser} || Accept-Language und navigator.languages stimmen normalerweise \u00fcberein. Eine Abweichung deutet auf eine Erweiterung oder einen Proxy, der Kopfzeilen umschreibt, oder auf eine Datenschutzeinstellung, die eines von beiden verf\u00e4lscht.\",\"befund_b_gpc_abweichend\":\"GPC weicht ab: Kopfzeile {server}, navigator.globalPrivacyControl {browser} || Kopfzeile und JavaScript-Eigenschaft sollten \u00fcbereinstimmen. Ist nur eines gesetzt, injiziert eine Erweiterung die Kopfzeile, oder der Browser zeigt die Eigenschaft, ohne das Signal zu senden.\",\"befund_b_ua_abweichend\":\"Der beim Server angekommene User-Agent-String weicht von navigator.userAgent ab || Etwas hat die Kopfzeile unterwegs umgeschrieben, oder ein Skript \u00fcberschreibt die Eigenschaft. Seiten, die beides vergleichen, werten das als Verschleierung.\",\"befund_b_zeitzone\":\"Zeitzone {zeitzone} passt nicht zum Land des Netzes {land} || Die Uhr des Browsers ist auf eine andere Region gestellt als die, zu der die Adresse geh\u00f6rt. Typisch f\u00fcr ein VPN oder auf Reisen; Seiten erkennen VPN-Nutzung genau an dieser Abweichung.\",\"befund_b_geraet\":\"Ger\u00e4t, wie der Browser es meldet: Bildschirm {bildschirm}, Pixelverh\u00e4ltnis {dpr}, {kerne} Kerne, {speicher} Speicher, Netz {netz}, Cookies {cookies} || Diese Werte gibt es nur f\u00fcr Skripte, nicht in Kopfzeilen, und sie sind das \u00fcbliche Rohmaterial eines Fingerabdrucks.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-mirror.php';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var KOPF_REIHE = ['user-agent', 'accept', 'accept-language', 'accept-encoding', 'sec-ch-ua', 'sec-ch-ua-mobile', 'sec-ch-ua-platform', 'sec-ch-ua-arch', 'sec-ch-ua-model', 'sec-ch-ua-full-version-list', 'sec-ch-ua-platform-version',\n        'sec-fetch-site', 'sec-fetch-mode', 'sec-fetch-dest', 'sec-fetch-user', 'sec-gpc', 'dnt', 'save-data', 'upgrade-insecure-requests', 'priority', 'referer', 'origin', 'host', 'via', 'x-forwarded-for', 'forwarded', 'cache-control', 'pragma', 'te', 'connection', 'device-memory', 'viewport-width', 'downlink', 'ect', 'rtt'];<\/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            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }<\/p>\n<p>    \/** Was der Browser ueber sich selbst sagt. Jede Sonde einzeln abgesichert. *\/\n    function sammeln(nav, fenster) {\n        nav = nav || navigator; fenster = fenster || window;\n        var r = { ua: null, sprachen: [], gpc: null, dnt: null, zeitzone: null, plattform: null, marken: [], mobil: null, bildschirm: null, dpr: null, kerne: null, speicher: null, cookies: null, netz: null };\n        try { r.ua = String(nav.userAgent || ''); } catch (e) {}\n        try { r.sprachen = liste(nav.languages).map(String); if (!r.sprachen.length && nav.language) { r.sprachen = [String(nav.language)]; } } catch (e) {}\n        try { r.gpc = (typeof nav.globalPrivacyControl === 'boolean') ? nav.globalPrivacyControl : null; } catch (e) {}\n        try { r.dnt = nav.doNotTrack !== undefined ? nav.doNotTrack : null; } catch (e) {}\n        try { r.zeitzone = Intl.DateTimeFormat().resolvedOptions().timeZone || null; } catch (e) {}\n        try { if (nav.userAgentData) { r.plattform = nav.userAgentData.platform || null; r.mobil = !!nav.userAgentData.mobile; r.marken = liste(nav.userAgentData.brands).map(function (b) { return b.brand + ' ' + b.version; }); } } catch (e) {}\n        try { r.bildschirm = fenster.screen ? fenster.screen.width + 'x' + fenster.screen.height : null; r.dpr = fenster.devicePixelRatio || null; } catch (e) {}\n        try { r.kerne = nav.hardwareConcurrency || null; r.speicher = nav.deviceMemory || null; } catch (e) {}\n        try { r.cookies = typeof nav.cookieEnabled === 'boolean' ? nav.cookieEnabled : null; } catch (e) {}\n        try { r.netz = (nav.connection && nav.connection.effectiveType) ? String(nav.connection.effectiveType) : null; } catch (e) {}\n        return r;\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), 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 && typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var kopf = {};\n        if (a.kopf && typeof a.kopf === 'object') { Object.keys(a.kopf).forEach(function (k) { if (typeof a.kopf[k] === 'string') { kopf[k.toLowerCase()] = a.kopf[k]; } }); }\n        var rdap = (a.rdap && typeof a.rdap === 'object') ? a.rdap : null;\n        var tls = (a.tls && typeof a.tls === 'object') ? a.tls : {};\n        var http = (a.http && typeof a.http === 'object') ? a.http : {};\n        return {\n            fehler: null, ip: a.ip ? String(a.ip) : '', familie: zahl(a.familie) || 0, ptr: a.ptr ? String(a.ptr) : null, port: zahl(a.port),\n            rdap: rdap ? { name: rdap.name ? String(rdap.name) : null, org: rdap.org ? String(rdap.org) : null, land: rdap.land ? String(rdap.land) : null, rechenzentrum: rdap.rechenzentrum ? String(rdap.rechenzentrum) : null } : null,\n            tls: { protokoll: tls.protokoll ? String(tls.protokoll) : null, cipher: tls.cipher ? String(tls.cipher) : null, bits: zahl(tls.bits) },\n            http: { version: http.version ? String(http.version) : null, methode: http.methode ? String(http.methode) : null },\n            kopf: kopf, kopfAnzahl: zahl(a.kopf_anzahl) || Object.keys(kopf).length, cookieNamen: liste(a.cookie_namen).map(String),\n            gpc: !!a.gpc, dnt: a.dnt !== undefined && a.dnt !== null ? String(a.dnt) : null,\n            befunde: befunde, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }<\/p>\n<p>    \/** Browser gegen Server: rein. Gibt weitere Befunde und Vergleichszeilen zurueck. *\/\n    function vergleichen(b, br) {\n        var zeilen = []; var befunde = [];\n        var serverSprache = b.kopf['accept-language'] ? b.kopf['accept-language'].split(',')[0].split(';')[0].trim() : null;\n        var browserSprache = br.sprachen.length ? br.sprachen[0] : null;\n        if (serverSprache !== null || browserSprache !== null) {\n            var gleichS = serverSprache !== null && browserSprache !== null && serverSprache.toLowerCase() === browserSprache.toLowerCase();\n            zeilen.push({ key: 'sprache', server: serverSprache || '-', browser: browserSprache || '-', gleich: gleichS });\n            if (!gleichS && serverSprache !== null && browserSprache !== null) { befunde.push({ key: 'b_sprache_abweichend', stufe: 'niedrig', daten: { server: serverSprache, browser: browserSprache } }); }\n        }\n        if (br.gpc !== null) {\n            var gleichG = br.gpc === b.gpc;\n            zeilen.push({ key: 'gpc', server: b.gpc ? '1' : '-', browser: br.gpc ? 'true' : 'false', gleich: gleichG });\n            if (!gleichG) { befunde.push({ key: 'b_gpc_abweichend', stufe: 'niedrig', daten: { server: b.gpc ? '1' : '-', browser: String(br.gpc) } }); }\n        }\n        if (br.ua !== null) {\n            var gleichU = b.kopf['user-agent'] === br.ua;\n            zeilen.push({ key: 'ua', server: b.kopf['user-agent'] || '-', browser: br.ua, gleich: gleichU });\n            if (!gleichU && b.kopf['user-agent']) { befunde.push({ key: 'b_ua_abweichend', stufe: 'info', daten: {} }); }\n        }\n        if (br.zeitzone) {\n            var land = b.rdap && b.rdap.land ? b.rdap.land : null;\n            var europa = \/^Europe\\\/\/.test(br.zeitzone);\n            var landEuropa = land ? \/^(AT|BE|BG|CH|CY|CZ|DE|DK|EE|ES|FI|FR|GB|GR|HR|HU|IE|IS|IT|LI|LT|LU|LV|MC|MT|NL|NO|PL|PT|RO|RS|SE|SI|SK|SM|UA|BA|ME|MK|AL|MD|BY|VA|AD|GI|FO)$\/i.test(land) : null;\n            zeilen.push({ key: 'zeitzone', server: land || '-', browser: br.zeitzone, gleich: landEuropa === null ? null : (landEuropa === europa) });\n            if (landEuropa !== null && landEuropa !== europa) { befunde.push({ key: 'b_zeitzone', stufe: 'niedrig', daten: { zeitzone: br.zeitzone, land: land } }); }\n        }\n        if (br.plattform) {\n            var sp = b.kopf['sec-ch-ua-platform'] ? b.kopf['sec-ch-ua-platform'].replace(\/\"\/g, '') : null;\n            zeilen.push({ key: 'plattform', server: sp || '-', browser: br.plattform, gleich: sp === null ? null : sp === br.plattform });\n        }\n        befunde.push({ key: 'b_geraet', stufe: 'info', daten: { bildschirm: br.bildschirm || '-', dpr: br.dpr === null ? '-' : br.dpr, kerne: br.kerne === null ? '-' : br.kerne, speicher: br.speicher === null ? '-' : br.speicher + ' GB', netz: br.netz || '-', cookies: br.cookies === null ? '-' : (br.cookies ? T.ja : T.nein) } });\n        return { zeilen: zeilen, befunde: befunde };\n    }<\/p>\n<p>    function abfragen() {\n        return fetch(ENDPUNKT, { method: 'GET', cache: 'no-store', credentials: 'same-origin' })\n            .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.MI = { bewerten: bewerten, sammeln: sammeln, vergleichen: vergleichen, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };<\/p>\n<p>    var btn = document.getElementById('mi-btn');\n    var out = document.getElementById('mi-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && txt !== null) { e.textContent = txt; } return e; }\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    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)); }<\/p>\n<p>    function darstellen(b, br, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\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        var v = vergleichen(b, br);\n        var alle = b.befunde.concat(v.befunde);\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = alle.filter(function (f) { return f.stufe === s; }); });<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_verbindung));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_ip, b.ip + (b.familie ? '  (' + T['familie_' + b.familie] + ')' : '') + (b.port !== null ? ', ' + T.zeile_port + ' ' + b.port : ''));\n        paar(g, T.zeile_ptr, b.ptr || T.wert_keiner, b.ptr ? '' : GRAU);\n        if (b.rdap) { paar(g, T.zeile_netz, (b.rdap.name || '-') + (b.rdap.org ? ' \u2013 ' + b.rdap.org : '') + (b.rdap.land ? ' (' + b.rdap.land + ')' : '') + (b.rdap.rechenzentrum ? ' \u2013 ' + b.rdap.rechenzentrum : ''), b.rdap.rechenzentrum ? WARN : GRAU); }\n        paar(g, T.zeile_tls, b.tls.protokoll ? b.tls.protokoll + (b.tls.cipher ? ', ' + b.tls.cipher : '') + (b.tls.bits ? ' (' + b.tls.bits + ' bit)' : '') : T.wert_keiner, b.tls.protokoll && \/1\\.3\/.test(b.tls.protokoll) ? GUT : (b.tls.protokoll ? '' : ROT));\n        paar(g, T.zeile_http, b.http.version || '-', GRAU);\n        paar(g, T.zeile_cookies, b.cookieNamen.length ? b.cookieNamen.join(', ') : T.wert_keiner, GRAU);\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);<\/p>\n<p>        var kopfKeys = KOPF_REIHE.filter(function (k) { return typeof b.kopf[k] === 'string'; });\n        ziel.appendChild(el('div', UEBERSCHRIFT, text('h_kopf', { n: kopfKeys.length })));\n        var gk = gitter('auto auto');\n        kopfKeys.forEach(function (k) { paar(gk, k, b.kopf[k], (k === 'sec-gpc' || k === 'dnt') ? GUT : (k === 'user-agent' ? '' : GRAU)); });\n        ziel.appendChild(gk);<\/p>\n<p>        if (v.zeilen.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_vergleich));\n            var huelle = el('div', 'overflow-x: auto;');\n            var gv = gitter('auto auto auto auto');\n            [T.spalte_merkmal, T.server_sieht, T.browser_sagt, ''].forEach(function (s) { gv.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s)); });\n            v.zeilen.forEach(function (z) {\n                gv.appendChild(el('div', ZELLE + ' white-space: nowrap;', T['v_' + z.key]));\n                gv.appendChild(el('div', ZELLE_WERT + GRAU, z.server));\n                gv.appendChild(el('div', ZELLE_WERT + GRAU, z.browser));\n                gv.appendChild(el('div', ZELLE_WERT + (z.gleich === null ? GRAU : (z.gleich ? GUT : WARN)), z.gleich === null ? '\u2013' : (z.gleich ? T.gleich : T.verschieden)));\n            });\n            huelle.appendChild(gv);\n            ziel.appendChild(huelle);\n        }<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = 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 t = text('befund_' + f.key, f.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.MI.darstellen = darstellen;<\/p>\n<p>    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        var br = sammeln();\n        abfragen().then(function (a) { darstellen(bewerten(a), br, out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), br, out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zeigt, was dieser Server aus einem Besuch erf\u00e4hrt, bevor ein Skript l\u00e4uft: Adresse und Netzinhaber, TLS-Version und Cipher, HTTP-Version, jede Anfragekopfzeile samt Global Privacy Control, Do Not Track und Client Hints, und vergleicht es mit dem, was der Browser selbst \u00fcber sich sagt.<\/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,92301,92071],"class_list":["post-15562","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl-de","tag-networking-de","tag-web-security-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Verbindungsspiegel: Was der Server sieht - 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\/connection-mirror-what-the-server-sees\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Verbindungsspiegel: Was der Server sieht - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Zeigt, was dieser Server aus einem Besuch erf\u00e4hrt, bevor ein Skript l\u00e4uft: Adresse und Netzinhaber, TLS-Version und Cipher, HTTP-Version, jede Anfragekopfzeile samt Global Privacy Control, Do Not Track und Client Hints, und vergleicht es mit dem, was der Browser selbst \u00fcber sich sagt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/connection-mirror-what-the-server-sees\/\" \/>\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\\\/connection-mirror-what-the-server-sees\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/connection-mirror-what-the-server-sees\\\/\",\"name\":\"Verbindungsspiegel: Was der Server sieht - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T12:19:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/connection-mirror-what-the-server-sees\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/connection-mirror-what-the-server-sees\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/connection-mirror-what-the-server-sees\\\/#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\":\"Verbindungsspiegel: Was der Server sieht\"}]},{\"@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":"Verbindungsspiegel: Was der Server sieht - 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\/connection-mirror-what-the-server-sees\/","og_locale":"en_US","og_type":"article","og_title":"Verbindungsspiegel: Was der Server sieht - Lukas Wojcik - Blog","og_description":"Zeigt, was dieser Server aus einem Besuch erf\u00e4hrt, bevor ein Skript l\u00e4uft: Adresse und Netzinhaber, TLS-Version und Cipher, HTTP-Version, jede Anfragekopfzeile samt Global Privacy Control, Do Not Track und Client Hints, und vergleicht es mit dem, was der Browser selbst \u00fcber sich sagt.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/connection-mirror-what-the-server-sees\/","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\/connection-mirror-what-the-server-sees\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/connection-mirror-what-the-server-sees\/","name":"Verbindungsspiegel: Was der Server sieht - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T12:19:44+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/connection-mirror-what-the-server-sees\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/connection-mirror-what-the-server-sees\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/connection-mirror-what-the-server-sees\/#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":"Verbindungsspiegel: Was der Server sieht"}]},{"@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\/15562","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=15562"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15562\/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=15562"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}