// ═══════════════════════════════════════════════════════════════ // FALSE REPORT TABLOSU (otomatik oluşturulur) // ═══════════════════════════════════════════════════════════════ $pdo->exec("CREATE TABLE IF NOT EXISTS false_reports ( id INTEGER PRIMARY KEY AUTOINCREMENT, scan_id TEXT, machine TEXT, ip TEXT, file TEXT, line INTEGER, severity TEXT, category TEXT, reason TEXT, code TEXT, engine TEXT, hash_sha256 TEXT, false_note TEXT, status TEXT DEFAULT 'pending', created_at TEXT DEFAULT CURRENT_TIMESTAMP )"); $pdo->exec("CREATE INDEX IF NOT EXISTS idx_false_scan ON false_reports(scan_id)"); $pdo->exec("CREATE INDEX IF NOT EXISTS idx_false_status ON false_reports(status)"); // ═══════════════════════════════════════════════════════════════ // ENDPOINT: report_false (POST) // Bulgu false pozitif olarak bildirilir // ═══════════════════════════════════════════════════════════════ if ($action === 'report_false') { if ($_SERVER['REQUEST_METHOD'] !== 'POST') { json_out(['ok' => false, 'error' => 'POST gerekli'], 405); } $raw = file_get_contents('php://input'); $data = json_decode($raw, true); if (!is_array($data)) { json_out(['ok' => false, 'error' => 'Geçersiz JSON'], 400); } // Zorunlu alanlar $file = substr((string)($data['file'] ?? ''), 0, 500); $reason = substr((string)($data['reason'] ?? ''), 0, 1000); if ($file === '' || $reason === '') { json_out(['ok' => false, 'error' => 'file ve reason zorunlu'], 400); } try { $stmt = $pdo->prepare("INSERT INTO false_reports ( scan_id, machine, ip, file, line, severity, category, reason, code, engine, hash_sha256, false_note ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([ substr((string)($data['scan_id'] ?? ''), 0, 100), substr((string)($data['machine'] ?? 'unknown'), 0, 200), $_SERVER['REMOTE_ADDR'] ?? 'unknown', $file, (int)($data['line'] ?? 0), substr((string)($data['severity'] ?? ''), 0, 20), substr((string)($data['category'] ?? ''), 0, 200), $reason, substr((string)($data['code'] ?? ''), 0, 2000), substr((string)($data['engine'] ?? ''), 0, 50), substr((string)($data['hash_sha256'] ?? ''), 0, 64), substr((string)($data['false_note'] ?? ''), 0, 1000), ]); $id = $pdo->lastInsertId(); json_out([ 'ok' => true, 'report_id' => $id, 'message' => 'False bildirim alındı. Teşekkürler!', ]); } catch (Exception $e) { json_out(['ok' => false, 'error' => 'Kayıt hatası: ' . $e->getMessage()], 500); } } // ═══════════════════════════════════════════════════════════════ // ENDPOINT: false_stats (GET) // False bildirim istatistikleri // ═══════════════════════════════════════════════════════════════ if ($action === 'false_stats') { $total = (int)$pdo->query( 'SELECT COUNT(*) FROM false_reports')->fetchColumn(); $pending = (int)$pdo->query( "SELECT COUNT(*) FROM false_reports WHERE status='pending'") ->fetchColumn(); $approved = (int)$pdo->query( "SELECT COUNT(*) FROM false_reports WHERE status='approved'") ->fetchColumn(); $rejected = (int)$pdo->query( "SELECT COUNT(*) FROM false_reports WHERE status='rejected'") ->fetchColumn(); // Kategori bazlı $cats = $pdo->query(" SELECT category, COUNT(*) as c FROM false_reports GROUP BY category ORDER BY c DESC LIMIT 20 ")->fetchAll(); json_out([ 'ok' => true, 'total' => $total, 'pending' => $pending, 'approved' => $approved, 'rejected' => $rejected, 'by_category' => $cats, ]); } // ═══════════════════════════════════════════════════════════════ // ENDPOINT: admin (GET) - Şifre korumalı // False bildirimleri yönetim paneli // ═══════════════════════════════════════════════════════════════ if ($action === 'admin') { // Admin şifresi (api.php en üstünde ADMİN_PW sabitini tanımla) $ADMIN_PW = defined('ADMIN_PW') ? ADMIN_PW : 'earth_admin_2026'; $given = $_GET['pw'] ?? $_POST['pw'] ?? ''; if (!hash_equals($ADMIN_PW, $given)) { html_out(' Admin Giriş

🔒 Admin Girişi

'); } // İşlem: status güncelle if (isset($_GET['set_status']) && isset($_GET['id'])) { $sid = (int)$_GET['id']; $st = $_GET['set_status']; if (in_array($st, ['pending', 'approved', 'rejected'])) { $pdo->prepare('UPDATE false_reports SET status=? WHERE id=?') ->execute([$st, $sid]); } } // İşlem: sil if (isset($_GET['delete']) && isset($_GET['id'])) { $sid = (int)$_GET['id']; $pdo->prepare('DELETE FROM false_reports WHERE id=?') ->execute([$sid]); } // Filtre $filter = $_GET['filter'] ?? 'all'; $where = ''; if (in_array($filter, ['pending', 'approved', 'rejected'])) { $where = "WHERE status='" . $filter . "'"; } $rows = $pdo->query(" SELECT * FROM false_reports $where ORDER BY id DESC LIMIT 500 ")->fetchAll(); // İstatistik $total = (int)$pdo->query( 'SELECT COUNT(*) FROM false_reports')->fetchColumn(); $pending = (int)$pdo->query( "SELECT COUNT(*) FROM false_reports WHERE status='pending'") ->fetchColumn(); $approved = (int)$pdo->query( "SELECT COUNT(*) FROM false_reports WHERE status='approved'") ->fetchColumn(); $rejected = (int)$pdo->query( "SELECT COUNT(*) FROM false_reports WHERE status='rejected'") ->fetchColumn(); // Kategori özeti $cats = $pdo->query(" SELECT category, COUNT(*) as c FROM false_reports GROUP BY category ORDER BY c DESC LIMIT 15 ")->fetchAll(); $rows_html = ''; foreach ($rows as $r) { $id = (int)$r['id']; $st = $r['status']; $st_color = $st === 'pending' ? '#eab308' : ($st === 'approved' ? '#22c55e' : '#ef4444'); $st_label = $st === 'pending' ? '⏳ Bekliyor' : ($st === 'approved' ? '✅ Onaylandı' : '❌ Reddedildi'); $file_esc = esc($r['file']); $reason_esc = esc($r['reason']); $code_esc = esc(substr($r['code'], 0, 300)); $note_esc = esc($r['false_note']); $cat_esc = esc($r['category']); $machine_esc = esc($r['machine']); $date_esc = esc($r['created_at']); $sev_esc = esc($r['severity']); $eng_esc = esc($r['engine']); // İşlem URL'leri $url_base = '?action=admin&pw=' . urlencode($given); $url_approve = $url_base . "&set_status=approved&id=$id"; $url_reject = $url_base . "&set_status=rejected&id=$id"; $url_pending = $url_base . "&set_status=pending&id=$id"; $url_delete = $url_base . "&delete=1&id=$id"; $rows_html .= " $id $st_label $date_esc $machine_esc $sev_esc $cat_esc $file_esc $reason_esc " . ($note_esc ? "$note_esc" : "-") . " $code_esc $eng_esc ✅ ❌ ⏳ 🗑️ "; } if (!$rows_html) { $rows_html = "Kayıt yok"; } $cats_html = ''; foreach ($cats as $c) { $cats_html .= "" . esc($c['category']) . " " . $c['c'] . ""; } $filter_all_url = $url_base; $filter_pending_url = $url_base . '&filter=pending'; $filter_approved_url = $url_base . '&filter=approved'; $filter_rejected_url = $url_base . '&filter=rejected'; html_out(" False Bildirimler - Admin

🔒 False Bildirimler — Admin Panel

Toplam
$total
Bekliyor
$pending
Onaylı
$approved
Reddedildi
$rejected
$cats_html
Tümü ($total) ⏳ Bekleyen ($pending) ✅ Onaylı ($approved) ❌ Reddedilen ($rejected)
$rows_html
IDDurumTarihMakine ÖnemKategoriDosyaNeden False NotuKodMotorİşlem
"); }