ession_start(); // IP real considerando Cloudflare e proxies if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $ip = $_SERVER['HTTP_CF_CONNECTING_IP']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $partes = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $ip = trim($partes[0]); } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } else { $ip = 'UNKNOWN'; } $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $requisicao = isset($_GET['url']) ? $_GET['url'] : ''; $hora = time(); $logFile = __DIR__ . '/bloqueios.log'; $tempDir = sys_get_temp_dir(); $rateFile = $tempDir . '/ratelimit_' . md5($ip); $limitePorMinuto = 20; // 🔓 Permitir bots confiáveis $botsValidos = array( 'Googlebot', 'Bingbot', 'Slurp', // Yahoo 'DuckDuckBot', 'Baiduspider', 'YandexBot', 'facebot', // Facebook 'ia_archiver' // Alexa ); foreach ($botsValidos as $bot) { if (stripos($userAgent, $bot) !== false) { file_put_contents($logFile, '[' . date('Y-m-d H:i:s') . "] BOT LIBERADO - IP: $ip | UA: $userAgent | URL: $requisicao\n", FILE_APPEND); $arquivoRequisitado = __DIR__ . '/' . $requisicao; if (is_file($arquivoRequisitado)) { include $arquivoRequisitado; } elseif (is_dir($arquivoRequisitado) && file_exists($arquivoRequisitado . '/index.php')) { include $arquivoRequisitado . '/index.php'; } else { http_response_code(404); echo 'Página não encontrada.'; } exit; } } // Navegadores mainstream $mainBrowsers = array('Mozilla', 'Chrome', 'Safari', 'Firefox', 'Edge', 'Opera'); $isBrowser = false; foreach ($mainBrowsers as $browser) { if (stripos($userAgent, $browser) !== false) { $isBrowser = true; break; } } // ⛔ Bloqueia tudo que não seja navegador mainstream nem bot válido if (!$isBrowser) { file_put_contents($logFile, '[' . date('Y-m-d H:i:s') . "] 404 - UA inválido - IP: $ip | UA: $userAgent | URL: $requisicao\n", FILE_APPEND); http_response_code(404); echo 'Página não encontrada.'; exit; } // ⏱️ Verifica quantidade de acessos por IP $acessos = array(); if (file_exists($rateFile)) { $linhas = file($rateFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($linhas as $linha) { if (is_numeric($linha) && $linha > ($hora - 60)) { $acessos[] = $linha; } } } $acessos[] = $hora; file_put_contents($rateFile, implode("\n", $acessos)); // ⛔ Se ultrapassou o limite → 404 if (count($acessos) > $limitePorMinuto) { file_put_contents($logFile, '[' . date('Y-m-d H:i:s') . "] 404 - Rate limit - IP: $ip | UA: $userAgent | URL: $requisicao\n", FILE_APPEND); http_response_code(404); echo 'Página não encontrada.'; exit; } // ✅ Processa requisição normalmente $arquivoRequisitado = __DIR__ . '/' . $requisicao; if (is_file($arquivoRequisitado)) { include $arquivoRequisitado; } elseif (is_dir($arquivoRequisitado) && file_exists($arquivoRequisitado . '/index.php')) { include $arquivoRequisitado . '/index.php'; } else { http_response_code(404); echo 'Página não encontrada.'; } ?>