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.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.
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.
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:
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.
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.
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.
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.
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.
- 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.
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.