Matomo-Tracking und Aufrufzaehlung absichern
This commit is contained in:
@@ -55,31 +55,47 @@ $configuration = app_matomo_configuration();
|
||||
$assert('Vollständige Konfiguration wird aktiviert', $configuration !== null);
|
||||
$assert('Matomo-Basis-URL wird normalisiert', ($configuration['matomoUrl'] ?? '') === 'https://analytics.example.test/');
|
||||
$assert('Einwilligung gilt 180 Tage', ($configuration['consentMaxAge'] ?? 0) === 15552000);
|
||||
$assert('Neue Tracking-Art fragt bestehende Entscheidungen erneut ab', ($configuration['consentVersion'] ?? '') === '2');
|
||||
|
||||
$head = app_analytics_head_html();
|
||||
$body = app_analytics_body_html();
|
||||
$assert('Consent-Stylesheet wird lokal geladen', str_contains($head, 'assets/css/analytics-consent.css'));
|
||||
$assert('Consent-Stylesheet wird lokal und filterarm geladen', str_contains($head, 'assets/css/privacy-settings.css'));
|
||||
$assert('Zustimmen und Ablehnen stehen in derselben Ebene',
|
||||
str_contains($body, 'data-analytics-consent="denied"')
|
||||
&& str_contains($body, 'data-analytics-consent="granted"'));
|
||||
$assert('Matomo selbst ist im HTML nicht vorab eingebunden',
|
||||
!str_contains($body, 'src="https://analytics.example.test'));
|
||||
!str_contains($body, 'https://analytics.example.test')
|
||||
&& !str_contains($body, '"siteId"'));
|
||||
$assert('Cookie-Einstellungen bleiben nach der Entscheidung erreichbar',
|
||||
str_contains($body, 'analytics-consent-settings'));
|
||||
$assert('Browser nutzt den lokalen First-Party-Endpunkt',
|
||||
str_contains($body, '"trackingEndpoint":"nutzungsanalyse.php"')
|
||||
&& str_contains($body, 'assets/js/privacy-settings.js'));
|
||||
|
||||
$javascript = file_get_contents(APP_ROOT . '/assets/js/analytics-consent.js') ?: '';
|
||||
$assert('Tracker verlangt Tracking-Einwilligung', str_contains($javascript, "['requireConsent']"));
|
||||
$assert('Matomo-Script wird erst dynamisch nach Zustimmung erzeugt',
|
||||
str_contains($javascript, "document.createElement('script')"));
|
||||
$javascript = file_get_contents(APP_ROOT . '/assets/js/privacy-settings.js') ?: '';
|
||||
$assert('Tracker sendet nur bei erteilter Einwilligung',
|
||||
str_contains($javascript, "readDecision() !== 'granted'"));
|
||||
$assert('Browser sendet nur an den lokalen Endpunkt',
|
||||
str_contains($javascript, 'window.fetch(configuration.trackingEndpoint')
|
||||
&& !str_contains($javascript, 'matomo.js')
|
||||
&& !str_contains($javascript, 'matomo.php'));
|
||||
$assert('Query und Fragment werden aus Analyse-URLs entfernt',
|
||||
str_contains($javascript, 'url.origin + url.pathname'));
|
||||
$assert('Zusätzliche Browser- und Linkmessung bleibt deaktiviert',
|
||||
str_contains($javascript, "['disableBrowserFeatureDetection']")
|
||||
&& str_contains($javascript, "['disablePerformanceTracking']")
|
||||
&& !str_contains($javascript, "['enableLinkTracking']"));
|
||||
$assert('Widerruf stoppt Tracking und löscht Cookies',
|
||||
str_contains($javascript, "['forgetConsentGiven']")
|
||||
&& str_contains($javascript, "['deleteCookies']"));
|
||||
$assert('Keine Kaffeeliste-Benutzerkennung wird gelesen',
|
||||
!str_contains($javascript, 'userId')
|
||||
&& !str_contains($javascript, 'sessionStorage')
|
||||
&& !str_contains($javascript, 'localStorage'));
|
||||
$assert('Widerruf stoppt Tracking und löscht Analyse-Cookies',
|
||||
str_contains($javascript, 'removeAnalysisCookies()')
|
||||
&& str_contains($javascript, "name !== visitorCookieName"));
|
||||
|
||||
$relay = file_get_contents(APP_ROOT . '/app/analytics-relay.php') ?: '';
|
||||
$assert('Relay übernimmt keine Client-IP',
|
||||
!str_contains($relay, 'REMOTE_ADDR')
|
||||
&& !str_contains($relay, "'cip'"));
|
||||
$assert('Relay bindet Ziel und Site-ID an die Serverkonfiguration',
|
||||
str_contains($relay, "['idsite'] = \$configuration['siteId']")
|
||||
&& str_contains($relay, "\$configuration['matomoUrl'] . 'matomo.php'"));
|
||||
|
||||
$publicTemplates = [
|
||||
'abo-bestellen.php',
|
||||
@@ -113,6 +129,8 @@ $privacy = app_legal_document_text('privacy_notice');
|
||||
$assert('Aktuelle Datenschutzerklärung beschreibt Matomo und Widerruf',
|
||||
str_contains($privacy, 'Matomo')
|
||||
&& str_contains($privacy, 'Cookie-Einstellungen')
|
||||
&& str_contains($privacy, 'kaffeeliste_analytics_visitor')
|
||||
&& str_contains($privacy, 'nicht an Matomo weitergegeben')
|
||||
&& str_contains($privacy, 'Verifizierungs-, Passwort-Reset- und Zugriffs-Tokens'));
|
||||
|
||||
foreach ($previousEnvironment as $name => $value) {
|
||||
|
||||
Reference in New Issue
Block a user