v1.0.0
PriviMetrics 2
- <?php
-
- declare(strict_types=1);
- require_once __DIR__ . '/functions.php';
-
- if (!envIsInstalled()) {
- pmEmitPixelAndExit();
- }
- require_once __DIR__ . '/storage.php';
-
- header('Content-Type: image/gif');
- header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
- header('Pragma: no-cache');
-
- if (env('RESPECT_DNT', 'true') === 'true' && isDNTEnabled()) {
- echo pmPixel();
- exit;
- }
-
- $trackingCode = sanitize($_GET['t'] ?? '');
- if ($trackingCode === '') {
- echo pmPixel();
- exit;
- }
-
- $pageUrl = sanitize($_GET['p'] ?? '');
- $pageTitle = sanitize($_GET['title'] ?? '');
- $referrer = sanitize($_GET['r'] ?? '');
-
- $storage = new StorageManager();
- $site = $storage->findSiteByTrackingCode($trackingCode);
-
- if (!$site) {
- echo pmPixel();
- exit;
- }
-
- $domain = parse_url($pageUrl, PHP_URL_HOST) ?? '';
- if (!checkDomainMatch($site['domain'], $domain, $site['restriction_mode'])) {
- echo pmPixel();
- exit;
- }
-
- $rateLimit = pmRateLimitFor($site['storage'] ?? 'xml');
- if ($rateLimit['requests'] === 0) {
- http_response_code(204);
- exit;
- }
- if (!checkRateLimit('privimetrics_' . $trackingCode, $rateLimit['requests'], $rateLimit['window'])) {
- http_response_code(204);
- exit;
- }
-
- $parsedUrl = parse_url($pageUrl);
- $cleanUrl = ($parsedUrl['scheme'] ?? 'http') . '://' . ($parsedUrl['host'] ?? '');
- if (isset($parsedUrl['port'])) $cleanUrl .= ':' . $parsedUrl['port'];
- $cleanUrl .= $parsedUrl['path'] ?? '';
-
- $collectSearchQueries = pmFeatureEnabledForSite($site, 'search_queries');
- $collectTrafficSources = pmFeatureEnabledForSite($site, 'traffic_sources');
- $collectVisitorCountries = pmFeatureEnabledForSite($site, 'visitor_countries');
-
- $searchQuery = '';
- if ($collectSearchQueries && !empty($parsedUrl['query'])) {
- parse_str($parsedUrl['query'], $queryParams);
- foreach (['q', 'search', 'results'] as $param) {
- if (!empty($queryParams[$param])) {
- $searchQuery = sanitize($queryParams[$param]);
- break;
- }
- }
- }
-
- $utmSource = $collectTrafficSources ? extractUtmSource($pageUrl) : '';
-
- function pmIsExternalReferrer(string $referrer, string $pageUrl): bool
- {
- if ($referrer === '' || $pageUrl === '') return false;
- $refHost = parse_url($referrer, PHP_URL_HOST);
- $pageHost = parse_url($pageUrl, PHP_URL_HOST);
- if (!$refHost || !$pageHost) return false;
- $refHost = preg_replace('/^www\./i', '', strtolower($refHost));
- $pageHost = preg_replace('/^www\./i', '', strtolower($pageHost));
- return $refHost !== $pageHost;
- }
-
- function pmReferrerDomain(string $referrer): string
- {
- $host = parse_url($referrer, PHP_URL_HOST);
- if (!$host) return '';
- return preg_replace('/^www\./i', '', strtolower($host));
- }
-
- $trackIpParam = $_GET['track-ip'] ?? (env('TRACK_IP_DEFAULT', 'false') === 'true' ? 'true' : 'false');
- $trackIp = !in_array(strtolower((string) $trackIpParam), ['0', 'false', 'no'], true);
-
- if ($trackIp) {
- $realIP = getClientIP();
- $anonIP = '0.0.0.0';
- if (filter_var($realIP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
- $parts = explode('.', $realIP);
- $anonIP = ($parts[0] ?? '0') . '.' . ($parts[1] ?? '0') . '.X.X';
- } elseif (filter_var($realIP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
- $parts = explode(':', $realIP);
- $anonIP = ($parts[0] ?? '') . ':' . ($parts[1] ?? '') . ':XXXX:XXXX:XXXX:XXXX:XXXX:XXXX';
- }
- $geo = $collectVisitorCountries ? getCountryFromIP($realIP) : ['country' => 'Unknown', 'code' => 'XX'];
- } else {
- $anonIP = '0.0.0.0';
- $geo = $collectVisitorCountries ? getCountryFromIP($anonIP) : ['country' => 'Unknown', 'code' => 'XX'];
- }
- $userHash = pmVisitorHash(getClientIP(), getUserAgent(), (string) $domain);
-
- $hit = [
- 'user_hash' => $userHash,
- 'ip' => $anonIP,
- 'country' => $collectVisitorCountries ? ($geo['country'] ?? 'Unknown') : 'Unknown',
- 'country_code' => $collectVisitorCountries ? ($geo['code'] ?? 'XX') : 'XX',
- 'user_agent' => getUserAgent(),
- 'page_url' => $cleanUrl,
- 'page_title' => $pageTitle,
- 'search_query' => $searchQuery,
- 'referrer' => ($collectTrafficSources && pmIsExternalReferrer($referrer, $pageUrl)) ? pmReferrerDomain($referrer) : '',
- 'utm_source' => $utmSource,
- ];
-
- $storage->saveHit($site, $hit);
-
- echo pmPixel();
- exit;
-