Matomo-Tracking und Aufrufzaehlung absichern

This commit is contained in:
2026-08-27 12:20:56 +02:00
parent 528af07890
commit c86803bbd6
26 changed files with 1019 additions and 106 deletions
+37 -10
View File
@@ -150,7 +150,7 @@ den CSV-Import. Beide sind per `.htaccess` von außen gesperrt.
### 6. Migrationen einspielen
Es gibt 30 versionierte Migrationen in `database/migrations/`, angewendet
Es gibt 32 versionierte Migrationen in `database/migrations/`, angewendet
über `scripts/migrate.php`. Das Skript ist idempotent und wendet nur
fehlende Migrationen an. Es arbeitet ausschließlich im Prefix aus der
jeweiligen `env.local.php`; daher müssen Migrationen einmal in Staging und
@@ -360,9 +360,11 @@ putenv('MATOMO_PRIVACY_CONFIRMED=1');
```
`MATOMO_SITE_ID` durch die numerische Website-ID ersetzen. Die gemeinsame
Cookie-Domain ist nur richtig, wenn Marketingseite, App und Matomo tatsächlich
unter `kaffeeliste.de` betrieben werden sollen. Sonst leer lassen; die
Einwilligung gilt dann nur auf dem jeweils besuchten Host.
Cookie-Domain ist nur richtig, wenn Marketingseite und App unter
`kaffeeliste.de` laufen und dieselbe Entscheidung sowie Besucherkennung nutzen
sollen. Der Host der selbst betriebenen Matomo-Instanz darf davon abweichen.
Sonst leer lassen; die Einwilligung gilt dann nur auf dem jeweils besuchten
Host.
`MATOMO_PRIVACY_CONFIRMED=1` erst setzen, nachdem die Matomo-Instanz so
konfiguriert und geprüft wurde:
@@ -374,16 +376,19 @@ konfiguriert und geprüft wurde:
3. Roh- und Besuchsprotokolle werden spätestens nach 180 Tagen automatisch
gelöscht; verdichtete Berichte spätestens nach 25 Monaten.
4. Keine User-ID, benutzerbezogene Custom Dimensions, Heatmaps,
Sitzungsaufzeichnungen oder Werbeintegrationen aktivieren. Der eingebundene
Tracker deaktiviert zusätzlich Browser-Funktionserkennung,
Performance-Messung und Link-Klick-Tracking.
Sitzungsaufzeichnungen oder Werbeintegrationen aktivieren. Der
First-Party-Tracker übermittelt nur den bereinigten Seitenaufruf, eine
zufällige Besucherkennung und die im Datenschutzhinweis genannten wenigen
Browserangaben; Performance- und Link-Klick-Messung bleiben deaktiviert.
5. In Matomo ist genau eine Website mit den erlaubten Marketing- und
App-Domains angelegt. Testaufrufe mit Query-Parametern dürfen in Matomo nur
den Pfad ohne Query oder Fragment zeigen.
6. Im privaten Browserfenster prüfen: Vor der Entscheidung und nach „Nur
notwendige“ gibt es keine Anfrage an `matomo.js`/`matomo.php` und keine
`_pk_*`-Cookies. Nach Zustimmung gibt es beides; ein anschließender Widerruf
über „Cookie-Einstellungen“ stoppt weitere Aufrufe und löscht die Cookies.
notwendige“ gibt es keine Anfrage an `nutzungsanalyse.php` und kein
`kaffeeliste_analytics_visitor`-Cookie. Nach Zustimmung antwortet der lokale
POST an `nutzungsanalyse.php` mit HTTP 204 und der Aufruf erscheint in
Matomo. Ein anschließender Widerruf über „Cookie-Einstellungen“ stoppt
weitere Aufrufe und löscht das Besuchercookie.
Die Entscheidung wird 180 Tage im Cookie
`kaffeeliste_analytics_consent` gespeichert. Eine Versionsänderung in
@@ -391,6 +396,28 @@ Die Entscheidung wird 180 Tage im Cookie
oder Empfängern erfordern außerdem eine neue Datenschutzerklärung und eine
erneute rechtliche Prüfung.
Der Browser lädt weder `matomo.js` noch `matomo.php` vom Analysehost. Nach der
Einwilligung sendet `assets/js/privacy-settings.js` genau einen bereinigten
Seitenaufruf an den gleichnamigen Host-Endpunkt `nutzungsanalyse.php`. Dieser
validiert Einwilligung, Origin, Besucherkennung und URL und leitet den Aufruf
serverseitig an die feste `MATOMO_URL`/`MATOMO_SITE_ID` weiter. Die Client-IP
wird nicht als Tracking-Parameter an Matomo übermittelt.
### Anonyme Grundzählung ohne Einwilligung
Unabhängig von Matomo zählt `app/public-page-views.php` die GET-Aufrufe
ausgewählter öffentlicher HTML-Seiten. In `public_page_views` stehen nur der
Kalendertag, ein fester Seitenschlüssel und ein Summenzähler. IP-Adresse,
User-Agent, Referrer, vollständige URL, Query-Parameter, Cookies und
Benutzerkennungen werden weder gelesen noch in diese Statistik übernommen.
Die Auswertung steht ausschließlich Platform-Admins im Back-Office zur
Verfügung und zeigt heute, die letzten 30 Tage, den Gesamtstand sowie die
Aufteilung je Seite. Sie misst Seitenaufrufe, keine eindeutigen Besucher;
Wiederholungen und Bots können enthalten sein. Die Zählung beginnt erst nach
Anwendung von `0032_public_page_views.sql` und kann frühere Zugriffe nicht
rückwirkend rekonstruieren.
## Betreiber-Benachrichtigung bei neuer Registrierung
`register.php` schickt nach einer erfolgreichen Selbstregistrierung einen