// ═══════════════════════════════════════════════════════════════ // 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('
$file_esc$code_esc| ID | Durum | Tarih | Makine | Önem | Kategori | Dosya | Neden | False Notu | Kod | Motor | İşlem |
|---|