JExcellence
JExcellence
Full-Stack · Oldenburg
OPEN SOURCE · 7 MIN LESEZEIT

Warum ich einen kostenlosen Datenschutz-Check gebaut habe

Der Datenschutz-Check prüft Ihre Website im echten Chromium auf Tracker, Google Fonts und Cookie-Banner. Ohne Installation, ohne gespeicherte Daten.
Justin Eiletz30. Oktober 2026 · Aktualisiert 7. November 2026

Die meisten Website-Betreiber, mit denen ich spreche, haben einen Cookie-Banner und halten das Thema damit für erledigt. Trotzdem lädt die Seite beim ersten Besuch oft Schriften von Google, eine Karte oder ein Analytics-Skript, bevor jemand auf irgendetwas geklickt hat. Der Datenschutz-Check zeigt genau das, direkt im Browser und ohne etwas zu installieren.

Warum ein Webscanner neben der CLI

Die Prüfungen stammen aus PrivaLint, meinem Open-Source-Tool für Datenschutz-Checks im echten Browser. Über PrivaLint selbst habe ich einen eigenen Beitrag geschrieben. PrivaLint läuft als CLI, GitHub Action und Node.js-API. Das passt für Entwickler, aber nicht für die Inhaberin eines Kosmetikstudios oder den Geschäftsführer eines Handwerksbetriebs. Wer Node.js und Chromium installieren muss, um seine eigene Website zu prüfen, lässt es.

Also habe ich PrivaLint hinter ein Formular gesetzt: Adresse eingeben, bestätigen, dass es die eigene Website ist, Länderprofil wählen. Der Scan dauert höchstens drei Minuten, danach steht der Bericht auf der Seite. Die Befunde sind dieselben, die auch die CLI liefert, mit Belegen und einem Vorschlag zur Behebung.

Was beim Scan passiert

Der Scanner öffnet die Startseite in einem frischen Chromium ohne Cookies und ohne gespeicherte Daten. Er wartet, bis das Netzwerk ruhig ist, und zeichnet jede Anfrage, jedes Cookie und jeden Link auf. Erscheint der Banner spät, wartet er eine weitere Ruhephase. Findet er einen Cookie-Banner, drückt er zuerst bis zu 60-mal die Tab-Taste und prüft, ob der Ablehnen-Button so den Fokus bekommt. Dann klickt er auf „Ablehnen“, lädt die Seite neu und zeichnet ein zweites Mal auf. Danach folgen bis zu zwei Unterseiten derselben Website in Link-Reihenfolge. Impressum und Datenschutzerklärung, die die Startseite verlinkt, lädt er einmal zusätzlich und liest ihren Text, dazu eine dort verlinkte Cookie-Richtlinie, auch als PDF auf derselben Website.

Ausgewertet wird mit 28 Regeln von PrivaLint 0.10.0, hier zusammengefasst:

Prüfung
Was sie meldet
Tracker vor der Einwilligung
Analytics-, Werbe- und Session-Replay-Dienste, die vor einer Auswahl Anfragen senden, Cookies setzen oder localStorage beschreiben. Auch Google Analytics, Google Tag Manager und Meta Pixel, die über Ihre eigene Domain geleitet werden.
Fingerprinting
Skripte fremder Anbieter, die vor der Einwilligung Canvas-, WebGL- oder Audio-Merkmale des Browsers auslesen.
Daten in Anfragen
E-Mail-Adressen oder Telefonnummern in Anfragen an fremde Server, Dienste außerhalb der EU vor der Einwilligung, Tracking-Cookies mit mehr als 13 Monaten Laufzeit und vollständige Seitenadressen, die an andere Server gehen.
Tracker ohne Cookie-Banner
Tracker laufen, und es gibt überhaupt keinen Banner.
Tracker nach dem Ablehnen
Bekannte Tracker, die nach „Ablehnen“ und erneutem Laden weiterlaufen.
Ablehnen auf der ersten Ebene
Banner, die Akzeptieren anbieten, Ablehnen aber erst in den Einstellungen.
Ablehnen so leicht wie Zustimmen
Ablehnen nur als Text, deutlich kleiner oder kontrastärmer als Zustimmen, nicht mit der Tab-Taste erreichbar oder in einer anderen Sprache als die Seite.
Cookie-Einstellungen wieder aufrufbar
Kein sichtbarer Link, über den sich die Einwilligung später widerrufen lässt.
Rechtliche Links im Banner
Ein Banner, der die Seite blockiert, verlinkt Datenschutzerklärung oder Impressum nicht.
Google Fonts und Adobe Fonts
Schriftdateien, die von Google- oder Adobe-Servern geladen werden.
Eingebettete Inhalte
YouTube, Google Maps, reCAPTCHA, Chat- und Bewertungs-Widgets wie Intercom oder Trustpilot und ähnliche Einbindungen vor der Einwilligung.
Öffentliche CDNs
Skripte und Styles von jsDelivr, unpkg oder cdnjs.
Impressum und Datenschutzerklärung
Fehlende Links zu beiden Seiten.
Inhalt von Impressum und Datenschutzerklärung
Ein Impressum ohne Postanschrift oder E-Mail, eine Datenschutzerklärung ohne Kontakt des Verantwortlichen oder mit Vorlagentext, und Tracker oder Einbindungen der Startseite, die sie nicht nennt.
Formulare
Kontakt- oder Login-Formulare ohne Link zur Datenschutzerklärung daneben, vorab angehakte Werbe-Einwilligungen und Formulare, die über unverschlüsseltes HTTP senden.
Widerrufsbutton und Barrierefreiheit
Nur bei Onlineshops: der Button „Vertrag widerrufen“ und Informationen zur Barrierefreiheit.

Das Länderprofil (Deutschland, Österreich, Schweiz, Ungarn oder EU) bestimmt die Rechtsverweise in jedem Befund und, im Schweizer Profil, die Einstufung einzelner Regeln. Für Ungarn erkennt PrivaLint auch ungarische Banner-Buttons wie „Elutasítom“ und Links wie „Impresszum“. Den Standort des Browsers ändert das Profil nicht: Er bleibt der Standort des Servers.

Ein leerer Bericht ist kein Gütesiegel
Kein Befund heißt: Die automatischen Regeln haben in dem, was geladen wurde, nichts gefunden. Das bestätigt keine DSGVO-Konformität und ersetzt keine Rechtsberatung. Serverseitiges Tracking oder unbekannte Anbieter sieht der Scanner nicht.

Vorschau, vollständiger Bericht und Zugangscode

Ohne Code zeigt die Seite die fünf wichtigsten Einträge, nach Schwere sortiert und mit mindestens einem Fehler und einer Warnung, sofern es welche gibt. Den vollständigen Bericht schickt der Check per E-Mail: alle Befunde als gestaltete Mail, dazu ein PDF-Bericht und der JSON-Export von PrivaLint.

  • Ohne Code: Startseite plus zwei Unterseiten, also drei Seiten.
  • Mit Zugangscode: bis zu zehn Seiten und der vollständige Bericht direkt auf der Seite. Einen Code gebe ich auf Anfrage heraus.
  • Mehr Seiten: Für größere Websites lasse ich PrivaLint selbst laufen oder richte es in Ihrer Pipeline ein.

Welche Daten der Check behält

Keine. Ein Ergebnis liegt höchstens eine Stunde im Arbeitsspeicher und ist nur über einen zufälligen Link erreichbar. Ein Neustart des Dienstes löscht alles. Es gibt keine Konten, keine Datenbank und keine gespeicherten Berichte.

  • Gegen Missbrauch zählt der Dienst Scans pro Besucher. Dafür behält er nur einen HMAC der IP-Adresse mit einem Schlüssel, der täglich wechselt, nie die Adresse selbst.
  • Die E-Mail-Adresse für den Bericht geht nur an den Mailserver (IONOS) und wird danach nicht gespeichert.
  • Wer möchte, dass ich mich melde, setzt ein eigenes Häkchen und bestätigt das über einen Link in der Mail (Double Opt-in). Erst dann erfahre ich die Adresse.

Wie sich der Scanner selbst schützt

Ein Dienst, der beliebige Adressen aufruft, ist ein Angriffsziel: Jemand könnte versuchen, über ihn interne Systeme zu erreichen. Deshalb läuft der Scanner in einem eigenen Container ohne Zugangsdaten. Jede Anfrage des Browsers geht über einen Netzwerkadapter, der die Adresse auflöst und interne Bereiche ablehnt. Eine Firewall lässt aus dem Container nur DNS, HTTP und HTTPS nach außen, dazu den Mailversand.

Der Browser sendet nur lesende Anfragen (GET und HEAD). Beacons, also Pings mit Nutzungsdaten, schickt er bewusst nicht ab. Ihre Adressen landen trotzdem im Bericht, denn ein Tracker-Beacon ist selbst ein Befund.

Was mein eigener Scan aufgedeckt hat

Der erste vollständige Scan von jexcellence.de mit 50 Seiten zeigte auf jeder Regel der Startseite Gelb: „nicht alle Inhalte geladen“. Der Grund war eine einzige Anfrage. Next.js lädt verlinkte Seiten im Hintergrund vor und bricht diese Prefetches ab, wenn das Netz langsam ist. PrivaLint hielt die abgebrochene Anfrage für einen Ladefehler und markierte die ganze Startseite als unvollständig.

Seit PrivaLint 0.6.1 erkennt das Tool, wenn die Seite eine Anfrage selbst abbricht, und führt sie in den Ladedetails als „von der Seite selbst abgebrochen“. Echte Fehler wie Timeouts oder DNS-Probleme schränken das Ergebnis weiterhin ein. Ohne den Webscanner unter echter Last wäre mir das nicht aufgefallen.

Grenzen des Checks

  • Getestet wird „Ablehnen“ auf der Startseite. Das Abwählen in den Banner-Einstellungen prüft PrivaLint mit --check-settings, im Webscanner läuft diese Prüfung aber nicht, weil der zweite Browser-Durchlauf nicht ins Zeitlimit passt. Ob die Wahl dauerhaft gespeichert wird, prüft der Scanner ebenfalls nicht.
  • HTTPS und HSTS prüft nur die CLI. Der Webscanner stellt keine eigene Anfrage an http://.
  • Seiten hinter einem Login bleiben außen vor. Formulare werden nur daraufhin angesehen, ob ein Datenschutz-Link daneben steht; abgeschickt wird nichts.
  • Manche Websites verstecken Banner vor automatisierten Browsern. Dann meldet der Bericht keinen Banner, obwohl Besucher einen sehen.
  • Tracker erkennt PrivaLint anhand einer gepflegten Anbieterliste und, bei Cookies, rund 1.000 Einträgen aus der Open Cookie Database. Neue oder sehr kleine Anbieter können trotzdem fehlen.

Was nach dem Bericht kommt

Zwei Wege. Sie richten PrivaLint selbst ein: Es ist MIT-lizenziert, die Befehle stehen unter dem Bericht und im Repository. Oder Sie geben mir die Befunde. Ich binde Schriften lokal ein, lade Karten und Videos erst nach Einwilligung, richte den Banner mit Ablehnen auf der ersten Ebene ein und schicke danach einen Nachtest. Den Preis nenne ich, wenn ich den Bericht gesehen habe.

Website jetzt prüfen oder Befunde mit mir besprechen. Wenn Sie einen Fehlalarm finden, freue ich mich über ein Issue auf GitHub. privalint lebt von solchen Meldungen.

INHALT
Datenschutz-Check
DSGVO
Cookie-Banner
Google Fonts
privalint
Website prüfen
Hat dieser Artikel etwas in deinem Projekt aufgeworfen? Lass uns 30 Minuten darüber sprechen — kostenfrei und unverbindlich.