From e3fed71c766526d9cef3a5ecfe8953474cff3ea2 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 1 Oct 2026 10:34:20 +0000 Subject: [PATCH] Analyse: Rechtstexte Fix 1 (Kommentare nicht veroeffentlichen, Abschalt-Wortlaut, TOM) Co-Authored-By: Claude Sonnet 5.5 --- .../abo-bedingungen-ergaenzung-analyse.md | 4 ++-- docs/rechtliches/avv-website-analyse.md | 12 ++++++------ docs/rechtliches/datenschutz-analyse-pruefpunkte.md | 9 +++++++++ .../leistungsbeschreibung-website-analyse.md | 2 +- public/datenschutz.html | 4 ++-- runner/src/analytics-inject.js | 5 ++++- runner/src/templates/datenschutz-analyse.html | 12 +++--------- runner/test/analytics-inject.test.js | 9 ++++++++- 8 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 docs/rechtliches/datenschutz-analyse-pruefpunkte.md diff --git a/docs/rechtliches/abo-bedingungen-ergaenzung-analyse.md b/docs/rechtliches/abo-bedingungen-ergaenzung-analyse.md index 9804327..9139935 100644 --- a/docs/rechtliches/abo-bedingungen-ergaenzung-analyse.md +++ b/docs/rechtliches/abo-bedingungen-ergaenzung-analyse.md @@ -38,8 +38,8 @@ Bezug: aktuelle Abo-Bedingungen (Aufbau § 1 bis § 16, Leistungsbeschreibung B ## 4. § 11 Vertragsende: neuer Satz am Ende ```diff -+ Mit dem Vertragsende endet auch die Website-Analyse; wir entfernen Skript und Banner beim nächsten -+ Veröffentlichen der Website und löschen die Messdaten 60 Tage nach Abschaltung. ++ Mit dem Vertragsende endet auch die Website-Analyse; wir speichern dann keine Messdaten mehr, entfernen ++ Skript und Banner beim nächsten Veröffentlichen der Website und löschen die Messdaten 60 Tage nach Abschaltung. ``` ## 5. § 14 Datenschutz, Absatz (2): Ergänzung diff --git a/docs/rechtliches/avv-website-analyse.md b/docs/rechtliches/avv-website-analyse.md index 576c859..bdcc35e 100644 --- a/docs/rechtliches/avv-website-analyse.md +++ b/docs/rechtliches/avv-website-analyse.md @@ -6,9 +6,9 @@ zwischen dem Kunden als Verantwortlichem („Kunde“) und der WEBklar GbR, Am Schwimmbad 10, 67722 Winnweiler, vertreten durch die Gesellschafter Kenso Grimm und Justin Klein, als Auftragsverarbeiter („WEBklar“). -Dieser Vertrag ergänzt den Auftragsverarbeitungsvertrag in Anlage 1 der Abo-Bedingungen. Er wird vereinbart, wenn der Kunde im Kundenportal die Funktion „Website-Analyse“ einschaltet und dabei die Zustimmung zu dieser Fassung bestätigt (Haken im Portal; das Portal speichert Fassung, Zeitpunkt und Person). Schaltet ein Mitarbeiter von WEBklar die Funktion auf Wunsch des Kunden ein, bestätigt der Kunde diese Fassung vorher in Textform; WEBklar protokolliert das. +Dieser Vertrag ergänzt den Auftragsverarbeitungsvertrag in Anlage 1 der Abo-Bedingungen. Er wird vereinbart, wenn der Kunde im Kundenportal die Funktion „Website-Analyse“ einschaltet und dabei die Zustimmung zu dieser Fassung bestätigt (Haken im Portal; das Portal speichert Fassung, Zeitpunkt und Person). Schaltet ein Mitarbeiter von WEBklar die Funktion auf Wunsch des Kunden ein, bestätigt der Mitarbeiter im System, dass der Kunde diese Fassung des Vertrags bestätigt hat. Gespeichert werden die Fassung, der Zeitpunkt und der Name des Mitarbeiters. Bei Zustimmung im Kundenportal wird die Zustimmung dem Kundenkonto zugeordnet. - + ## 1. Gegenstand und Dauer @@ -83,7 +83,7 @@ WEBklar setzt nur Personen ein, die zur Vertraulichkeit verpflichtet sind oder e (1) Einzelne Ereignisse und Klickpositionen löscht WEBklar automatisch nach 30 Tagen. Zusammengefasste Tageswerte ohne Besucher-Kennung bleiben bis zum Ende der Website-Analyse (Ausschalten oder Ende des Wartungs-Abos) und weitere 60 Tage gespeichert; danach löscht WEBklar alle Daten der Website. Eine Kopie der Tageswerte stellt WEBklar dem Kunden auf Verlangen in Textform innerhalb dieser Frist zur Verfügung. -(2) Sicherungskopien werden im Rahmen der regulären Rotation überschrieben. +(2) Ob und wie lange Sicherungskopien Daten der Website-Analyse enthalten, ist noch zu klären (Prüfpunkt P8, siehe Anlage); soweit sie enthalten sind, werden sie im Rahmen der regulären Rotation überschrieben. (3) Gesetzliche Aufbewahrungspflichten bleiben unberührt. @@ -91,7 +91,7 @@ WEBklar setzt nur Personen ein, die zur Vertraulichkeit verpflichtet sind oder e ## 10. Nachweise und Kontrollen -WEBklar stellt dem Kunden alle Informationen zur Verfügung, die zum Nachweis der Pflichten aus Art. 28 DSGVO nötig sind, und ermöglicht Überprüfungen einschließlich Inspektionen durch den Kunden oder einen von ihm beauftragten, zur Verschwiegenheit verpflichteten Prüfer. Sie finden nach Anmeldung mit angemessener Frist (in der Regel 14 Tage) zu den Servicezeiten statt, ohne den Betrieb unzumutbar zu stören. Für das Rechenzentrum genügen in der Regel die Nachweise des Betreibers. Für mehr als eine Vor-Ort-Kontrolle pro Jahr kann WEBklar eine angemessene Vergütung verlangen. +WEBklar stellt dem Kunden alle Informationen zur Verfügung, die zum Nachweis der Pflichten aus Art. 28 DSGVO nötig sind, und ermöglicht Überprüfungen einschließlich Inspektionen durch den Kunden oder einen von ihm beauftragten, zur Verschwiegenheit verpflichteten Prüfer. Sie finden nach Anmeldung mit angemessener Frist (in der Regel 14 Tage) zu den Servicezeiten statt, ohne den Betrieb unzumutbar zu stören. Für das Rechenzentrum genügen in der Regel die Nachweise des Betreibers (Prüfpunkt P13). Für mehr als eine Vor-Ort-Kontrolle pro Jahr kann WEBklar eine angemessene Vergütung verlangen. ## 11. Pflichten des Kunden @@ -115,7 +115,7 @@ Der Kunde ist Verantwortlicher für die Verarbeitung. Er sorgt dafür, dass das |---|---| | Übertragung | Skript und Messdaten werden nur über TLS (HTTPS) übertragen. | | Keine Cookies | Es werden keine Cookies gesetzt. Auf dem Gerät des Besuchers wird nur die Banner-Auswahl im lokalen Speicher (Eintrag „wk-consent“) gespeichert; sie gilt sechs Monate. | -| Datenminimierung | IP-Adresse und Browser-Kennzeichen werden nicht gespeichert und nicht protokolliert; sie werden nur im Moment der Abfrage für Land, Geräteklasse und Bot-Erkennung verwendet. Pfade ohne Suchparameter, Elementpfade ohne Kennungen und Klassennamen. Keine Formulareingaben. | +| Datenminimierung | IP-Adresse und Browser-Kennzeichen werden nicht gespeichert und nicht protokolliert. Die IP-Adresse wird nur im Moment der Abfrage verwendet für: Länderzuordnung, Schlüssel der Mengenbegrenzung (Hash mit Tagessalz, nur im Arbeitsspeicher) und, nur nach Einwilligung, die tägliche Besucher-Kennung. Das Browser-Kennzeichen wird nur im Moment der Abfrage verwendet für: Geräteklasse, Bot-Erkennung und, nur nach Einwilligung, die tägliche Besucher-Kennung. Pfade ohne Suchparameter, Elementpfade ohne Kennungen und Klassennamen. Keine Formulareingaben. | | Pseudonymisierung | Die Besucher-Kennung (nur nach Einwilligung) ist ein gekürzter Hash mit Tagessalz. Das Salz liegt nur im Arbeitsspeicher und wird täglich um 00:00 Uhr (Europe/Berlin) neu erzeugt; ältere Kennungen sind danach nicht mehr verknüpfbar. | | Einwilligung | Ohne „Annehmen“ sendet das Skript nur Seitenaufruf und Banner-Zähler. „Global Privacy Control“ und „Do Not Track“ gelten als Ablehnen. | | Zugriffskontrolle | Die Verwaltungsschnittstelle des Messdienstes (Auswertung, Website-Verwaltung) läuft auf einem getrennten, internen Port, der nicht öffentlich erreichbar ist, und ist durch ein Zugriffstoken geschützt. Zugriff nur über das Kundenportal und die Verwaltung von WEBklar. Im Portal sieht jeder Kunde nur die Daten seiner eigenen Website. | @@ -123,7 +123,7 @@ Der Kunde ist Verantwortlicher für die Verarbeitung. Er sorgt dafür, dass das | Heatmap-Zugriff | Die Heatmap wird über einen signierten Link abgerufen, der 30 Minuten gültig ist. | | Löschung | Täglicher automatischer Job (02:30 Uhr, Europe/Berlin): Rohdaten und Klicks nach 30 Tagen; Websites, die seit mehr als 60 Tagen abgeschaltet sind, werden vollständig gelöscht. | | Trennung | Daten sind je Website getrennt (Website-Schlüssel); eigener Container und eigenes Datenverzeichnis des Messdienstes; kein Zugriff auf andere Kundendaten. | -| Rechenzentrum | Hetzner Online GmbH, Falkenstein (Deutschland), ISO/IEC 27001. | +| Rechenzentrum | Hetzner Online GmbH, Falkenstein (Deutschland). **[Prüfpunkt: Zertifizierung des Rechenzentrums (ISO/IEC 27001) vor Verwendung belegen, bevor sie genannt wird.]** | | Protokolle des Reverse-Proxys | Das Zugriffsprotokoll für die Messdienst-Adresse wird ohne Client-IP geführt. **[Prüfpunkt P7: Einstellung beim Livegang verifizieren.]** | | Datensicherung | Die tägliche Serversicherung (7 Tage) erfasst voraussichtlich auch das Datenverzeichnis des Messdienstes. **[Prüfpunkt P8: ob das Verzeichnis in der Sicherung enthalten ist und wie lange dort gelöschte Daten verbleiben, ist noch zu klären.]** | | Organisation | Verpflichtung aller Beteiligten auf Vertraulichkeit, Ablauf für Datenschutzverletzungen (Nr. 8 Abs. 4), Überprüfung der Maßnahmen mindestens einmal im Jahr. | diff --git a/docs/rechtliches/datenschutz-analyse-pruefpunkte.md b/docs/rechtliches/datenschutz-analyse-pruefpunkte.md new file mode 100644 index 0000000..783d13f --- /dev/null +++ b/docs/rechtliches/datenschutz-analyse-pruefpunkte.md @@ -0,0 +1,9 @@ +# Prüfpunkte zur Vorlage datenschutz-analyse.html (intern, nicht veröffentlichen) + +> Entwurf – vor Verwendung anwaltlich prüfen lassen. + +- **P1** Zählung ohne Einwilligung (Seitenaufruf, Referrer-Domain, Land, Gerätegröße): kein Zugriff auf das Endgerät nach § 25 TDDDG? Das Skript liest Referrer und Fensterbreite aus; Einordnung nach strenger DSK-Lesart offen. +- **P2** Tages-Kennung nach Einwilligung: pseudonym oder faktisch anonym? +- **P3** Rechtsgrundlage des anonymen Banner-Zählers (angezeigt, angenommen, abgelehnt). +- **P5** Speicherung der Banner-Wahl (auch der Ablehnung) im lokalen Speicher nach § 25 Abs. 2 Nr. 2 TDDDG; GPC/DNT wie Ablehnung. +- **P18** Betroffenenrechte bei nicht identifizierbaren Daten (Art. 11, Art. 12 Abs. 2 DSGVO), Formulierung unter "Deine Rechte". diff --git a/docs/rechtliches/leistungsbeschreibung-website-analyse.md b/docs/rechtliches/leistungsbeschreibung-website-analyse.md index 4b3448d..ca2c74c 100644 --- a/docs/rechtliches/leistungsbeschreibung-website-analyse.md +++ b/docs/rechtliches/leistungsbeschreibung-website-analyse.md @@ -58,7 +58,7 @@ (1) Der Kunde kann die Website-Analyse jederzeit im Kundenportal ausschalten. Mit Ende des Wartungs-Abos (auch bei Wechsel ins Hosting-Abo) endet die Website-Analyse automatisch. -(2) Beim nächsten Veröffentlichen der Website entfernt WEBklar dann Skript, Banner und Zusatzseite. Bis dahin kann die Messung weiterlaufen. WEBklar informiert den Kunden per E-Mail über die Abschaltung. +(2) Mit dem Abschalten werden keine Messdaten mehr gespeichert und die Heatmap ist nicht mehr abrufbar. Skript, Banner und Zusatzseite bleiben auf der Website sichtbar, bis die Website das nächste Mal veröffentlicht wird; dann entfernt WEBklar sie. Bei Websites ohne automatische Veröffentlichung geschieht das erst bei einer manuellen Veröffentlichung. WEBklar informiert den Kunden per E-Mail über die Abschaltung. (3) Die gespeicherten Daten der Website löscht WEBklar 60 Tage nach der Abschaltung (Einzelheiten im Auftragsverarbeitungsvertrag). Der Kunde ergänzt seine Datenschutzerklärung nach der Abschaltung entsprechend. diff --git a/public/datenschutz.html b/public/datenschutz.html index ef12b52..db69e11 100644 --- a/public/datenschutz.html +++ b/public/datenschutz.html @@ -44,7 +44,7 @@
WEBKLAR

Datenschutzerklärung

-

Stand 01.10.2026

+

Stand 30.09.2026

Hier erfahren Sie, welche personenbezogenen Daten wir verarbeiten, wenn Sie unsere Websites besuchen, unser Kundenportal nutzen oder mit uns einen Vertrag schließen, und welche Rechte Sie haben.

@@ -92,7 +92,7 @@

6b. Website-Analyse auf Websites unserer Kunden

-

Kunden mit Wartungs-Abo können für ihre eigene Website eine Reichweitenmessung einschalten. Dabei verarbeiten wir die Daten der Besucher dieser Websites ausschließlich als Auftragsverarbeiter nach den Weisungen des jeweiligen Kunden, der dafür Verantwortlicher ist. Wir verwenden diese Daten nicht für eigene Zwecke. Diese Datenschutzerklärung gilt für unsere eigenen Seiten und das Kundenportal. Wer eine Kundenwebsite besucht, findet die Informationen zur Messung (Zwecke, Rechtsgrundlagen, Speicherdauer, Rechte) auf der Website des Kunden, in der Regel unter „/datenschutz-analyse.html“. Die Daten liegen auf unserem Server bei der Hetzner Online GmbH in Deutschland.

+

Sobald diese Funktion freigeschaltet ist, können Kunden mit Wartungs-Abo für ihre eigene Website eine Reichweitenmessung einschalten. Dabei verarbeiten wir die Daten der Besucher dieser Websites ausschließlich als Auftragsverarbeiter nach den Weisungen des jeweiligen Kunden, der dafür Verantwortlicher ist. Wir verwenden diese Daten nicht für eigene Zwecke. Diese Datenschutzerklärung gilt für unsere eigenen Seiten und das Kundenportal. Wer eine Kundenwebsite besucht, findet die Informationen zur Messung (Zwecke, Rechtsgrundlagen, Speicherdauer, Rechte) auf der Website des Kunden, in der Regel unter „/datenschutz-analyse.html“. Die Daten liegen dann auf unserem Server bei der Hetzner Online GmbH in Deutschland.

7. Abos und Zahlung über Stripe

Schließen Sie eines unserer Abos ab, verarbeiten wir Name, E-Mail-Adresse, Rechnungsanschrift, das gewählte Abo und den gebuchten Zusatzspeicher, Abo- und Zahlungsstatus sowie Ihre Rechnungen. Zahlungsdaten wie Kartennummer oder IBAN geben Sie direkt bei unserem Zahlungsdienstleister ein. Wir erhalten davon nur eingeschränkte Angaben, etwa die Art des Zahlungsmittels und die letzten vier Ziffern.

diff --git a/runner/src/analytics-inject.js b/runner/src/analytics-inject.js index 43fb3b2..7413199 100644 --- a/runner/src/analytics-inject.js +++ b/runner/src/analytics-inject.js @@ -10,6 +10,9 @@ const TEMPLATE_URL = new URL('./templates/datenschutz-analyse.html', import.meta const esc = (s) => String(s).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); +// Interne Kommentare dürfen nie veröffentlicht werden. +export const stripComments = (t) => t.replace(/\s*?\n?/g, ''); + export const isValidBase = (b) => typeof b === 'string' && /^https:\/\/[^\s"'<>]+\/$/.test(b); export function scriptTag(analytics, baseUrl) { @@ -78,7 +81,7 @@ export async function injectAnalytics(dir, analytics, { baseUrl, onLine, fs = no if (!isValidBase(baseUrl)) throw new Error('Analyse: ungültige öffentliche Basis-URL'); const tag = scriptTag(analytics, baseUrl); const p = analytics.privacy || {}; - const template = await fs.readFile(TEMPLATE_URL, 'utf8'); + const template = stripComments(await fs.readFile(TEMPLATE_URL, 'utf8')); const withAddr = p.address ? template.replace(/\{\{#address\}\}|\{\{\/address\}\}/g, '') : template.replace(/\{\{#address\}\}[\s\S]*?\{\{\/address\}\}/g, ''); const page = withAddr.replace(/\{\{(company|address|email)\}\}/g, (_, k) => esc(p[k] ?? '')); await fs.writeFile(join(dir, PAGE), page, 'utf8'); diff --git a/runner/src/templates/datenschutz-analyse.html b/runner/src/templates/datenschutz-analyse.html index 1ed7831..bc4af34 100644 --- a/runner/src/templates/datenschutz-analyse.html +++ b/runner/src/templates/datenschutz-analyse.html @@ -5,12 +5,6 @@ Datenschutz – Reichweitenmessung - - - - - -