Skip to content

Commit

Permalink
- Session wird nun nur noch gestartet wenn sie benötigt wird, damit k…
Browse files Browse the repository at this point in the history
…önnen BOT Zugriffe Sessionlos erfolgen

- Erweiterung der Einstellungen für den Ausschluss von IP-Adressen/Ranges und BOT-Kennungen (globale Vorgaben in den Contao Einstellungen für alle Seiten)
  • Loading branch information
chopsol committed Oct 6, 2020
1 parent 6027bed commit 3d3c483
Show file tree
Hide file tree
Showing 7 changed files with 373 additions and 47 deletions.
5 changes: 3 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "chopsol/contao-matomo-tracker",
"description": "Contao 4 Hintergrund-Tracking mit Matomo",
"keywords":["contao","bundle","matomo","tracking"],
"version": "1.0.1",
"version": "1.0.2",
"type": "contao-bundle",
"homepage": "https://www.chop.de/",
"license": "LGPL-3.0-or-later",
Expand All @@ -16,7 +16,8 @@
"require": {
"php": "^7.2",
"contao/core-bundle": "^4.9",
"bugbuster/contao-botdetection-bundle":"^1.5",
"bugbuster/contao-botdetection-bundle":"^1.5.3",
"jaybizzle/crawler-detect": "^1.2",
"matomo/matomo-php-tracker": "^2.0"
},
"conflict": {
Expand Down
154 changes: 111 additions & 43 deletions src/EventListener/MatomoTracking.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,29 @@
use Contao\CoreBundle\Framework\ContaoFrameworkInterface;
use Contao\Database;
use Contao\PageModel;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\TerminateEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use MatomoTracker;
use BugBuster\BotDetection\ModuleBotDetection;
use Jaybizzle\CrawlerDetect\CrawlerDetect;

class MatomoTracking {

/**
* @var ContaoFrameworkInterface
*/
private $framework;
private $session;

/**
* Constructor.
*
* @param ContaoFrameworkInterface $framework
*/
public function __construct(ContaoFrameworkInterface $framework, SessionInterface $session) {
public function __construct(ContaoFrameworkInterface $framework) {

$this->framework = $framework;
$this->session = $session;
$this->session = false;
$this->sessionData = array();
}

function onKernelRequest(RequestEvent $requestEvent) {
Expand All @@ -41,7 +41,9 @@ function onKernelRequest(RequestEvent $requestEvent) {
}

if ($rootPage = PageModel::findByPk($page->rootId)) {

$GLOBALS['COMATRACK_INIT'] = false;

if (isset($rootPage->useComatrack) && $rootPage->useComatrack == '1') {

// Prüfung der Konfigurationsvariablen auf Existenz und Werte
Expand All @@ -66,51 +68,109 @@ function onKernelRequest(RequestEvent $requestEvent) {
return;
}

// Sessiondaten laden um zu prüfen ob der Nutzer im Backend angemeldet ist
$sessionData = $this->session->all();
// Ist der Nutzer im Backend angemeldet, tracken wir im Frontend nichts.
if (isset($sessionData['_security_contao_backend'])) {
if (trim($_SERVER['HTTP_USER_AGENT']) == '') {
if (isset($rootPage->comatrack_debug) && $rootPage->comatrack_debug == '1') {
\System::log('Background-Tracking: User im Backend angemeldet', __METHOD__, TL_GENERAL);
\System::log('Background-Tracking: UserAgent nicht gesetzt, Ausschluss als BOT', __METHOD__, TL_GENERAL);
}
$GLOBALS['COMATRACK_INIT'] = false;
return;
}

}
}
// Sessiondaten laden sofern eine Session zuvor initialisiert wurde
if ($request->hasPreviousSession()) {

$this->session = \System::getContainer()->get('session');
$this->sessionData = $this->session->all();
// Ist der Nutzer im Backend angemeldet, tracken wir im Frontend nichts.
if (isset($this->sessionData['_security_contao_backend'])) {
if (isset($rootPage->comatrack_debug) && $rootPage->comatrack_debug == '1') {
\System::log('Background-Tracking: User im Backend angemeldet', __METHOD__, TL_GENERAL);
}
$GLOBALS['COMATRACK_INIT'] = false;
return;
}
}

// Als Initialwert für die Visitor-ID verwenden wir die Session-ID. Da sich diese im
// laufe einer Sitzung ändern könnte, speichern wir uns unsere Visitor-ID in der Session
// Matomo verwendet als Visitor-ID eine 16-stellige Hexadezimal-ID. Damit wir diese aus
// der Session-ID generieren können verwende ich eine MD5 Summe der Session-ID und
// kürze diese auf 16 Stellen.
if (!isset($sessionData['comatrackVisitorId'])) {
$GLOBALS['comatrackVistorId'] = substr(md5($this->session->getId()), 0, 16);
$this->session->set('comatrackVisitorId',$GLOBALS['comatrackVistorId']);
} else {
$GLOBALS['comatrackVistorId'] = $sessionData['comatrackVisitorId'];
}
// Bot-Erkennung - Bots sollen nicht getrackt werden
// Um die Bot-Detection nicht jedes mal bei einer Nutzer-Session durchzuführen
// zu müssen setzen wir einen Wert im Session-Cookie
if (!isset($this->sessionData['comatrackIsBot'])) {

// IP-Ausschlussliste prüfen
$exludeIPs = \Config::get('comatrack_exclude_ip');
if (strlen($exludeIPs)>0) {
$exludeIPs = explode("~~~",$exludeIPs);
if (count($exludeIPs)>0) {
$realIP = \Chopsol\ContaoMatomoTracker\IpCheck::getUserIP();
foreach ($exludeIPs as $exludeIP) {
if (preg_match("/:/",$exludeIP) && preg_match("/:/",$realIP)) {
if (\Chopsol\ContaoMatomoTracker\IpCheck::IPv6InRange($realIP, $exludeIP)) {
if (isset($rootPage->comatrack_debug) && $rootPage->comatrack_debug == '1') {
\System::log('Background-Tracking: IP in Exclude-Liste ('.$realIP.' => '.$exludeIP.')', __METHOD__, TL_GENERAL);
}
$GLOBALS['COMATRACK_INIT'] = false;
return;
}
} elseif (preg_match("/\./",$exludeIP) && preg_match("/\./",$realIP)) {
if (\Chopsol\ContaoMatomoTracker\IpCheck::IPv4InRange($realIP, $exludeIP)) {
if (isset($rootPage->comatrack_debug) && $rootPage->comatrack_debug == '1') {
\System::log('Background-Tracking: IP in Exclude-Liste ('.$realIP.' => '.$exludeIP.' )', __METHOD__, TL_GENERAL);
}
$GLOBALS['COMATRACK_INIT'] = false;
return;
}
}
}
}
}

// Ausschlussliste für UserAgents prüfen
$exlude_uas = \Config::get('comatrack_exclude_ua');
if (strlen($exlude_uas)>0) {
$exlude_uas = explode("~~~",$exlude_uas);
if (count($exlude_uas)>0) {
foreach ($exlude_uas as $exlude_ua) {
// \System::log('Background-Tracking: Check UserAgent ('.$exlude_ua.')', __METHOD__, TL_GENERAL);
if ($_SERVER['HTTP_USER_AGENT'] === $exlude_ua) {
if (isset($rootPage->comatrack_debug) && $rootPage->comatrack_debug == '1') {
\System::log('Background-Tracking: UserAgent in Exclude-Liste', __METHOD__, TL_GENERAL);
}
$GLOBALS['COMATRACK_INIT'] = false;
return;
}
}
}
}

// Bot-Erkennung - Bots sollen nicht getrackt werden
// Um die Bot-Detection innerhalb einer Nutzer-Session nur einmalig zu initialisieren
// speichern wir die Information dazu ebenfalls in der Session.
if (!isset($sessionData['comatrackIsBot'])) {
$ModuleBotDetection = new ModuleBotDetection();
if ($ModuleBotDetection->checkBotAllTests()) {
$GLOBALS['COMATRACK_INIT'] = false;
$GLOBALS['COMATRACK_ISBOT'] = true;
$this->session->set('comatrackIsBot',true);
return;
$ModuleBotDetection = new ModuleBotDetection();
if ($ModuleBotDetection->checkBotAllTests()) {
$GLOBALS['COMATRACK_INIT'] = false;
$GLOBALS['COMATRACK_ISBOT'] = true;
$GLOBALS['COMATRACK_ISBOT2'] = false;
return;
}
// Zweite Ebene des Craweler Detectors
$CrawlerDetect = new CrawlerDetect;
// Check the user agent of the current 'visitor'
if($CrawlerDetect->isCrawler()) {
$GLOBALS['COMATRACK_INIT'] = false;
$GLOBALS['COMATRACK_ISBOT'] = true;
$GLOBALS['COMATRACK_ISBOT2'] = true;
return;
}
if ($this->session === false) {
$this->session = \System::getContainer()->get('session');
}
$this->session->set('comatrackIsBot',false);
}
elseif($this->sessionData['comatrackIsBot'] == true) {
$GLOBALS['COMATRACK_INIT'] = false;
$GLOBALS['COMATRACK_ISBOT'] = true;
$GLOBALS['COMATRACK_ISBOT2'] = true;
return;
}
}
$this->session->set('comatrackIsBot',false);
}
elseif($sessionData['comatrackIsBot'] == true) {
$GLOBALS['COMATRACK_INIT'] = false;
$GLOBALS['COMATRACK_ISBOT'] = true;
return;
}

}

function onKernelTerminate(TerminateEvent $event) {
Expand All @@ -125,6 +185,12 @@ function onKernelTerminate(TerminateEvent $event) {
// dann loggen wir den Zugriff um die Prozesslaufzeit sehen zu können
if (isset($GLOBALS['COMATRACK_ISBOT']) && $GLOBALS['COMATRACK_ISBOT'] === true && $GLOBALS['COMATRACK_SETTINGS']['debug']) {
\System::log('Background-Tracking: Bot skipped' . ($gentime ? " / " . ($gentime / 1000) . "s" : ''), __METHOD__, TL_GENERAL);
return;
}
// Zweite Bot-Detection separat loggen
if (isset($GLOBALS['COMATRACK_ISBOT2']) && $GLOBALS['COMATRACK_ISBOT2'] === true && $GLOBALS['COMATRACK_SETTINGS']['debug']) {
\System::log('Background-Tracking: Bot2 skipped' . ($gentime ? " / " . ($gentime / 1000) . "s" : ''), __METHOD__, TL_GENERAL);
return;
}

// Ist das Tracking nicht initialisiert (z.B. wegen einem Zugriff auf dem Backend)
Expand All @@ -135,7 +201,7 @@ function onKernelTerminate(TerminateEvent $event) {

// Soll eine 404 Seite nicht geloggt werden und handelt es sich um eine 404 Seite
// Protokollieren wir das im Logging sofern aktiv, ansonsten brechen wir ab
if (!$GLOBALS['COMATRACK_SETTINGS']['404'] && $GLOBALS['COMATRACK_SETTINGS']['is_404']) {
if (!$GLOBALS['COMATRACK_SETTINGS']['404'] && $GLOBALS['COMATRACK_SETTINGS']['is_404'] && (!isset($this->sessionData['comatrackIsBot']) || $this->sessionData['comatrackIsBot'] === false)) {
if ($GLOBALS['COMATRACK_SETTINGS']['debug']) {
\System::log('Background-Tracking: 404 skipped'.($gentime?" / ".($gentime/1000)."s":''), __METHOD__, TL_GENERAL);
}
Expand Down Expand Up @@ -188,10 +254,12 @@ function onKernelTerminate(TerminateEvent $event) {
// damit keine Details des Trackings im Logfiles des Servers verbleiben
$matomoTracker->enableBulkTracking();

// Besucher-ID setzen
if ($GLOBALS['comatrackVistorId']) {
$matomoTracker->setVisitorId($GLOBALS['comatrackVistorId']);
// Verwendung der Session-ID zur Erkennung einer Benutzer-Session
// Da die ID in Matomo Hexadezimal sein muss, kodieren wir die Session-ID per MD5
if ($this->session === false) {
$this->session = \System::getContainer()->get('session');
}
$matomoTracker->setVisitorId(substr(md5($this->session->getId()), 0, 16));

// Die aufgerufene URL bereitstellen
$matomoTracker->setUrl(\Environment::get('uri'));
Expand Down
2 changes: 0 additions & 2 deletions src/Resources/config/listener.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,12 @@ services:
class: Chopsol\ContaoMatomoTracker\EventListener\MatomoTracking
arguments:
- '@contao.framework'
- '@session'
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: -50 }

comatrack.listener.kernel_terminate.tracking:
class: Chopsol\ContaoMatomoTracker\EventListener\MatomoTracking
arguments:
- '@contao.framework'
- '@session'
tags:
- { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate, priority: 0 }
Loading

0 comments on commit 3d3c483

Please sign in to comment.