?php // Rastreamento básico das páginas públicas. Este arquivo deve ser incluído pelo header.php. $arquivoExecutado = isset($_SERVER['SCRIPT_FILENAME']) ? realpath((string)$_SERVER['SCRIPT_FILENAME']) : false; if (PHP_SAPI !== 'cli' && $arquivoExecutado !== false && $arquivoExecutado === __FILE__) { http_response_code(404); exit; } require_once __DIR__ . '/config.php'; function trackerLimitarTexto($valor, $limite, $padrao = '') { if (!is_scalar($valor)) { return $padrao; } $texto = trim(preg_replace('/[\x00-\x1F\x7F]/u', ' ', (string)$valor) ?? ''); if ($texto === '') { return $padrao; } return function_exists('mb_substr') ? mb_substr($texto, 0, $limite, 'UTF-8') : substr($texto, 0, $limite); } function trackerPaginaAtual() { $uri = is_string($_SERVER['REQUEST_URI'] ?? null) ? $_SERVER['REQUEST_URI'] : '/'; $caminho = parse_url($uri, PHP_URL_PATH); if (!is_string($caminho) || $caminho === '' || $caminho[0] !== '/') { $caminho = '/'; } if ($caminho === '/') { $caminho = '/index.php'; } return trackerLimitarTexto($caminho, 190, '/index.php'); } function trackerRefererSeguro() { $referer = is_string($_SERVER['HTTP_REFERER'] ?? null) ? trim($_SERVER['HTTP_REFERER']) : ''; if ($referer === '' || strlen($referer) > 2000) { return 'Direto'; } $partes = parse_url($referer); if (!is_array($partes) || !in_array(strtolower((string)($partes['scheme'] ?? '')), ['http', 'https'], true) || empty($partes['host']) || isset($partes['user']) || isset($partes['pass'])) { return 'Direto'; } $hostReferer = strtolower((string)$partes['host']); $hostSite = strtolower((string)(parse_url(SITE_URL, PHP_URL_HOST) ?? '')); if ($hostReferer === $hostSite) { $caminho = (string)($partes['path'] ?? '/'); return trackerLimitarTexto($caminho !== '' ? $caminho : '/', 190, '/'); } // Para referências externas, registra somente a origem, nunca caminhos ou parâmetros. return trackerLimitarTexto( strtolower((string)$partes['scheme']) . '://' . $hostReferer, 190, 'Direto' ); } function trackerVisitorIdValido($valor) { return is_string($valor) && preg_match('/^[a-f0-9]{32}$/', $valor) === 1; } function trackerConexaoSegura() { $https = strtolower((string)($_SERVER['HTTPS'] ?? '')); if ($https !== '' && $https !== 'off' && $https !== '0') { return true; } // Aceita o cabeçalho somente quando o site estiver atrás de proxy HTTPS. $protocoloProxy = strtolower(trim(explode(',', (string)($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? ''))[0])); return $protocoloProxy === 'https'; } function trackerGravarCookie($nome, $valor) { if (headers_sent()) { return false; } return setcookie($nome, $valor, [ 'expires' => time() + (180 * 24 * 60 * 60), 'path' => '/', 'secure' => trackerConexaoSegura(), 'httponly' => true, 'samesite' => 'Lax', ]); } function trackerIpEmCidr($ip, $cidr) { $partes = explode('/', $cidr, 2); if (count($partes) !== 2) { return false; } $ipBinario = @inet_pton($ip); $redeBinaria = @inet_pton($partes[0]); if ($ipBinario === false || $redeBinaria === false || strlen($ipBinario) !== strlen($redeBinaria)) { return false; } $totalBits = strlen($ipBinario) * 8; $prefixo = filter_var($partes[1], FILTER_VALIDATE_INT); if ($prefixo === false || $prefixo < 0 || $prefixo > $totalBits) { return false; } $bytesCompletos = intdiv($prefixo, 8); $bitsRestantes = $prefixo % 8; if ($bytesCompletos > 0 && substr($ipBinario, 0, $bytesCompletos) !== substr($redeBinaria, 0, $bytesCompletos)) { return false; } if ($bitsRestantes === 0) { return true; } $mascara = (0xFF << (8 - $bitsRestantes)) & 0xFF; return (ord($ipBinario[$bytesCompletos]) & $mascara) === (ord($redeBinaria[$bytesCompletos]) & $mascara); } function trackerAcessoAutomatizado($userAgent, $ip) { $ua = strtolower((string)$userAgent); $marcadores = [ 'bot', 'crawler', 'spider', 'slurp', 'headless', 'preview', 'facebookexternalhit', 'whatsapp', 'telegrambot', 'discordbot', 'curl/', 'wget/', 'python-requests', 'go-http-client', 'anthropic', 'claude', 'gptbot', 'chatgpt-user', 'perplexity', 'bytespider', 'semrush', 'ahrefs', 'mj12bot', ]; foreach ($marcadores as $marcador) { if ($ua !== '' && strpos($ua, $marcador) !== false) { return true; } } // Faixa utilizada por infraestrutura de crawler/IA da Anthropic em AWS. // O filtro afeta somente as estatísticas; o acesso ao site continua liberado. return trackerIpEmCidr($ip, '216.73.216.0/22'); } if (PHP_SAPI === 'cli') { return; } $pagina_exibicao = trackerPaginaAtual(); $prefixosIgnorados = ['/admin/', '/painel/', '/api/', '/webhook_', '/cron']; foreach ($prefixosIgnorados as $prefixo) { if (strpos($pagina_exibicao, $prefixo) === 0) { return; } } $ipRecebido = is_string($_SERVER['REMOTE_ADDR'] ?? null) ? $_SERVER['REMOTE_ADDR'] : ''; $ip = filter_var($ipRecebido, FILTER_VALIDATE_IP) ? $ipRecebido : '0.0.0.0'; $ip = trackerLimitarTexto($ip, 45, '0.0.0.0'); $user_agent = trackerLimitarTexto($_SERVER['HTTP_USER_AGENT'] ?? '', 255, 'Não informado'); $referer = trackerRefererSeguro(); // Não contabiliza robôs, pré-visualizadores e crawlers de IA como visitantes. if (trackerAcessoAutomatizado($user_agent, $ip)) { try { // Remove também eventuais linhas recentes que esse mesmo acesso automatizado // tenha criado antes da instalação deste filtro. $stmt = $pdo->prepare("DELETE FROM visitantes_online WHERE ip = ? AND user_agent = ?"); $stmt->execute([$ip, $user_agent]); } catch (Throwable $e) { error_log('Tracker: não foi possível limpar o acesso automatizado - ' . $e->getMessage()); } return; } // O cookie próprio é a fonte principal do identificador. A sessão PHP permanece // apenas como apoio, evitando que uma falha na persistência da sessão transforme // cada atualização do mesmo navegador em um novo visitante. $nomeCookieVisitante = 'luciane_visitor_id'; $visitorIdCookie = $_COOKIE[$nomeCookieVisitante] ?? ''; $visitorIdSessao = $_SESSION['visitor_id'] ?? ''; $novoVisitante = false; if (trackerVisitorIdValido($visitorIdCookie)) { $visitor_id = strtolower($visitorIdCookie); } elseif (trackerVisitorIdValido($visitorIdSessao)) { $visitor_id = strtolower($visitorIdSessao); } else { $visitor_id = bin2hex(random_bytes(16)); $novoVisitante = true; } $_SESSION['visitor_id'] = $visitor_id; if (!trackerVisitorIdValido($visitorIdCookie) || !hash_equals(strtolower($visitorIdCookie), $visitor_id)) { if (trackerGravarCookie($nomeCookieVisitante, $visitor_id)) { // Disponibiliza o valor também durante a requisição atual. $_COOKIE[$nomeCookieVisitante] = $visitor_id; } elseif (empty($_SESSION['tracker_cookie_erro_registrado'])) { error_log('Tracker: não foi possível gravar o cookie persistente do visitante. Verifique se tracker.php é incluído antes de qualquer HTML.'); $_SESSION['tracker_cookie_erro_registrado'] = true; } } try { $stmt = $pdo->prepare(" INSERT INTO visitantes_online (visitor_id, ip, user_agent, pagina_atual, ultima_atividade) VALUES (?, ?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE ip = VALUES(ip), user_agent = VALUES(user_agent), pagina_atual = VALUES(pagina_atual), ultima_atividade = NOW() "); $stmt->execute([$visitor_id, $ip, $user_agent, $pagina_exibicao]); if ($novoVisitante) { try { $stmt = $pdo->prepare(" INSERT INTO estatisticas (data, ip, visitor_id, user_agent, pagina_entrada, referer) VALUES (CURDATE(), ?, ?, ?, ?, ?) "); $stmt->execute([$ip, $visitor_id, $user_agent, $pagina_exibicao, $referer]); } catch (PDOException $e) { // Compatibilidade restrita a bancos que ainda não receberam a coluna visitor_id. if ($e->getCode() !== '42S22') { throw $e; } $stmt = $pdo->prepare(" INSERT INTO estatisticas (data, ip, user_agent, pagina_entrada, referer) VALUES (CURDATE(), ?, ?, ?, ?) "); $stmt->execute([$ip, $user_agent, $pagina_exibicao, $referer]); } } // A limpeza deixa de rodar em toda visualização para reduzir bloqueios e carga no banco. if (random_int(1, 50) === 1) { $stmt = $pdo->prepare(" DELETE FROM visitantes_online WHERE ultima_atividade < DATE_SUB(NOW(), INTERVAL 5 MINUTE) "); $stmt->execute(); } } catch (Throwable $e) { if (empty($_SESSION['tracker_erro_registrado'])) { error_log('Tracker: não foi possível registrar a visita - ' . $e->getMessage()); $_SESSION['tracker_erro_registrado'] = true; } } Todos os Produtos - Luciane Rodrigues Bebês Reborn
Luciane Rodrigues Bebês Reborn

25 produto(s) disponível(is)

Destaque
Menina
Maria

Maria

Apenas 1 unidade(s) disponível(is)
R$ 1.890,00 ou 8x de R$ 236,25 sem juros no cartão
R$ 1.701,00 no PIX
1 2 3