<?php
// includes/firewall.php
// Proteção Anti-DDoS e Bloqueio Manual (CORRIGIDO)

// --- CONFIGURAÇÕES ---
$ddos_active = true;       
$time_window = 5;          
$max_requests = 100; // Aumentei um pouco para evitar falso positivo no admin       
$auto_block_reason = "Bloqueio Automático (Ataque DDoS/Flood)";

$ip = $_SERVER['REMOTE_ADDR'];
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';

// 1. VERIFICA SE O IP ESTÁ NA LISTA NEGRA (BANIDO)
// Verifica se a tabela existe antes para não dar erro fatal se você apagou
try {
    $stmt = $pdo->prepare("SELECT id FROM blocked_ips WHERE ip = ? LIMIT 1");
    $stmt->execute([$ip]);
    if ($stmt->fetch()) {
        http_response_code(403);
        die("<center><h1>403 - ACESSO NEGADO</h1><p>Seu IP ($ip) foi banido deste servidor.</p></center>");
    }
} catch (Exception $e) {
    // Se a tabela não existir, passa direto (não bloqueia ninguém)
}

// 2. VERIFICA SE É UM ROBO/USER-AGENT PROIBIDO
if (!empty($ua)) {
    try {
        // CORREÇÃO AQUI: Agora selecionamos 'user_agent', não 'id'
        $stmt = $pdo->query("SELECT user_agent FROM blocked_user_agents");
        $banned_agents = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        foreach ($banned_agents as $agent) {
            // Verifica se tem valor antes de comparar
            if (!empty($agent['user_agent']) && stripos($ua, $agent['user_agent']) !== false) {
                http_response_code(403);
                die("<center><h1>403 - ACESSO NEGADO</h1><p>Navegador/App não permitido.</p></center>");
            }
        }
    } catch (Exception $e) {}
}

// 3. SISTEMA ANTI-DDOS (FLOOD)
if ($ddos_active) {
    try {
        $now = time();
        $stmt = $pdo->prepare("SELECT * FROM flood_control WHERE ip = ?");
        $stmt->execute([$ip]);
        $flood = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($flood) {
            if (($now - $flood['last_time']) < $time_window) {
                $new_count = $flood['count'] + 1;
                
                if ($new_count > $max_requests) {
                    $stmt = $pdo->prepare("INSERT INTO blocked_ips (ip, notes, date) VALUES (?, ?, ?)");
                    $stmt->execute([$ip, $auto_block_reason, $now]);
                    
                    $pdo->prepare("DELETE FROM flood_control WHERE ip = ?")->execute([$ip]);
                    
                    die("<center><h1>403 - BANIDO</h1><p>Você foi bloqueado por excesso de requisições.</p></center>");
                } else {
                    $pdo->prepare("UPDATE flood_control SET count = ? WHERE ip = ?")->execute([$new_count, $ip]);
                }
            } else {
                $pdo->prepare("UPDATE flood_control SET count = 1, last_time = ? WHERE ip = ?")->execute([$now, $ip]);
            }
        } else {
            $pdo->prepare("INSERT INTO flood_control (ip, count, last_time) VALUES (?, 1, ?)")->execute([$ip, $now]);
        }
    } catch (Exception $e) {}
}
?>
