, // ref: document.referrer.substring(0,200) // })); // // // // // // SQL da tabela necessária: // // CREATE TABLE IF NOT EXISTS site_acesso ( // id INT UNSIGNED NOT NULL AUTO_INCREMENT, // site_id INT UNSIGNED NOT NULL, // ip_hash VARCHAR(64) NOT NULL, // data_acesso DATETIME NOT NULL DEFAULT NOW(), // url_referer VARCHAR(500) NULL, // PRIMARY KEY (id), // INDEX idx_site_data (site_id, data_acesso), // INDEX idx_data (data_acesso) // ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 // COMMENT='Acessos nos portais públicos — dedup 1h/sessão'; // // ============================================================== error_reporting(0); ini_set('display_errors', 0); // Responde imediatamente com GIF 1×1 transparente // e continua o processamento em background (evita bloquear o browser) header('Content-Type: image/gif'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); echo base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'); // Desconecta o browser e continua processando (fastcgi_finish_request ou ob_flush) if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } else { if (ob_get_level() > 0) { ob_flush(); flush(); } } // ── Validação do site_id ──────────────────────────────────── $site_id = 0; if ($_SERVER['REQUEST_METHOD'] === 'POST') { parse_str(file_get_contents('php://input'), $post_data); $site_id = (int)($post_data['site_id'] ?? 0); $referer = substr($post_data['ref'] ?? '', 0, 500); } else { $site_id = (int)($_GET['site_id'] ?? 0); $referer = substr($_SERVER['HTTP_REFERER'] ?? '', 0, 500); } if ($site_id <= 0) exit; // ── Deduplicação: 1h por IP por site ──────────────────────── // Usa sessão PHP para evitar múltiplos registros do mesmo // visitante dentro de 1 hora (não infla contadores com reloads) if (session_status() === PHP_SESSION_NONE) { @session_start(); } $sess_key = 'sa_'.$site_id; $now = time(); $intervalo = 3600; // 1 hora em segundos if (isset($_SESSION[$sess_key]) && ($now - $_SESSION[$sess_key]) < $intervalo) { exit; // já registrado recentemente } $_SESSION[$sess_key] = $now; // ── Conecta ao banco ──────────────────────────────────────── $base_dir = __DIR__; if (file_exists($base_dir.'/admin/includes/mysql.php')) require_once($base_dir.'/admin/includes/mysql.php'); elseif (file_exists($base_dir.'/admin/mysql.php')) require_once($base_dir.'/admin/mysql.php'); elseif (file_exists($base_dir.'/includes/mysql.php')) require_once($base_dir.'/includes/mysql.php'); elseif (file_exists($base_dir.'/mysql.php')) require_once($base_dir.'/mysql.php'); else exit; if (!class_exists('MySQL')) exit; $db = new MySQL(); // ── Hash do IP (privacidade — nunca salva IP em claro) ────── $ip_raw = $_SERVER['HTTP_CF_CONNECTING_IP'] // Cloudflare ?? $_SERVER['HTTP_X_FORWARDED_FOR'] // Proxy ?? $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; // Pega apenas o primeiro IP da cadeia de proxies $ip_raw = trim(explode(',', $ip_raw)[0]); $ip_hash = hash('sha256', $ip_raw . date('Y-m-d')); // hash diário (não rastreável) // ── Sanitização ───────────────────────────────────────────── $sid = (int)$site_id; $ref_esc = ''; try { if (method_exists($db, 'escape')) { $ref_esc = $db->escape($referer); } else { $ref_esc = addslashes($referer); } } catch (Throwable $e) { $ref_esc = ''; } // ── Insere o registro ──────────────────────────────────────── try { $sql = "INSERT INTO site_acesso (site_id, ip_hash, data_acesso, url_referer) VALUES ({$sid}, '{$ip_hash}', NOW(), ".($ref_esc ? "'{$ref_esc}'" : 'NULL').")"; if (method_exists($db, 'query')) $db->query($sql); elseif (method_exists($db, 'insert')) $db->insert($sql); } catch (Throwable $e) { error_log('[NegóciosRio track_site] Erro ao registrar acesso: '.$e->getMessage()); } exit;