GUARD_WINDOW * 60) return false; return guard_hash(GUARD_SECRET . '|' . $t) === $k; } // Лог теневого режима и блокировок (ротация простым сбросом при 2 МБ) function guard_log($reason, $ip) { if (is_file(GUARD_LOG) && filesize(GUARD_LOG) > 2097152) { @file_put_contents(GUARD_LOG, ''); } $line = sprintf( "%s\t%s\t%s\t%s\n", date('Y-m-d H:i:s'), $reason, $ip, substr(trim($_SERVER['HTTP_USER_AGENT'] ?? ''), 0, 200) ); @file_put_contents(GUARD_LOG, $line, FILE_APPEND | LOCK_EX); } $guard_reason = null; $guard_token_fail = false; $ua = trim($_SERVER['HTTP_USER_AGENT'] ?? ''); if ($ua === '' || preg_match($GUARD_UA_RE, $ua)) { $guard_reason = 'ua_bot'; } else { $t = $_GET['t'] ?? ''; $k = $_GET['k'] ?? ''; if (!guard_token_valid($t, $k)) { $guard_token_fail = true; $sfm = $_SERVER['HTTP_SEC_FETCH_MODE'] ?? ''; $sfs = $_SERVER['HTTP_SEC_FETCH_SITE'] ?? ''; $browser_fetch = in_array($sfm, ['cors', 'same-origin', 'no-cors'], true) && ($sfs === '' || in_array($sfs, ['cross-site', 'same-site', 'same-origin', 'none'], true)); if (GUARD_MODE === 'strict') { $guard_reason = 'no_token'; } elseif (GUARD_MODE === 'soft') { if (!$browser_fetch) $guard_reason = 'no_token'; } // shadow: блокируем только явных ботов, остальное пишем в лог } } if ($guard_token_fail) { guard_log($guard_reason !== null ? $guard_reason : (GUARD_MODE === 'shadow' ? 'shadow_no_token' : 'soft_pass'), $client_ip); } if ($guard_reason !== null) { http_response_code(403); die(); } $cache_file = CACHE_FILE; $api_response = ""; // Безопасное чтение файла с защитой от гонки процессов if (file_exists($cache_file)) { $fp = fopen($cache_file, "r"); if (flock($fp, LOCK_SH)) { $fsize = filesize($cache_file); if ($fsize > 0) { $content = fread($fp, $fsize); if (!empty($content)) { $api_response = trim($content); } } flock($fp, LOCK_UN); } fclose($fp); } if (!empty($api_response)) { $url = xor_decode($api_response, XOR_KEY); if (strpos($url, 'http') === 0) { echo json_encode([ "success" => true, "url" => $url ], JSON_UNESCAPED_SLASHES); } else { http_response_code(500); echo json_encode([ "success" => false, "error" => "Invalid decoded URL. Make sure get.php is running." ]); } } else { http_response_code(404); echo json_encode([ "success" => false, "error" => "No cache available. Wait for get.php to run." ]); } ?>