<?php
/* cyber.php – Киберугрозы | Avatiah Security Index
   Обновление: каждые 30 мин через JS (без cron)
   Кэш: cyber_cache.json
   API: fetch_cyber.php
   Дата: 01.11.2025 10:00 UTC
   Актуальные данные: 4 инцидента (Radware: утроение атак с октября 2023)
*/

date_default_timezone_set('UTC');
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-cache, must-revalidate');

$update_interval = 30; // Каждые 30 минут

// --- 1. Чтение кэша (все данные динамические) ---
$cache_file = __DIR__ . '/cyber_cache.json';
$cyber = json_decode(file_get_contents($cache_file), true) ?: [
    'last_update' => '01.11.2025 10:00 UTC',
    'aal' => 4,
    'aal_text' => 'Критическая активность',
    'aal_color' => '#ef4444',
    'incidents_24h' => 4,
    'chart_data' => [0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4],
    'normal_range' => '0–1',
    'trend' => 'Растущий (утроение атак с октября 2023)',
    'sectors' => [
        ['name' => 'Правительственный', 'attacks' => 2, 'share' => 50, 'vectors' => 'DDoS, утечки', 'source' => 'Radware 2025'],
        ['name' => 'Энергетика', 'attacks' => 1, 'share' => 25, 'vectors' => 'SCADA', 'source' => 'NSFOCUS'],
        ['name' => 'Оборона', 'attacks' => 1, 'share' => 25, 'vectors' => 'Фишинг (MURKYTOUR)', 'source' => 'Microsoft'],
        ['name' => 'Финансовый', 'attacks' => 0, 'share' => 0, 'vectors' => '-', 'source' => 'Times of Israel']
    ],
    'incidents' => [
        ['type' => 'DDoS атаки', 'severity' => 'high', 'desc' => 'Массированные атаки на порталы (координация хактивистов)', 'target' => 'Правительство, СМИ', 'source' => 'Radware, октябрь 2025'],
        ['type' => 'Целевой фишинг', 'severity' => 'medium', 'desc' => 'Атаки на сотрудников (MURKYTOUR malware)', 'target' => 'Военные подрядчики', 'source' => 'NSFOCUS, апрель 2025'],
        ['type' => 'Утечки данных', 'severity' => 'high', 'desc' => 'Публикация в даркнете (Maya Technologies, 15+ ГБ)', 'target' => 'Конфиденциальные документы', 'source' => 'Ynet, октябрь 2025'],
        ['type' => 'Инфраструктурные атаки', 'severity' => 'medium', 'desc' => 'Нарушение SCADA (50% атак на энергетику)', 'target' => 'Энергосистемы', 'source' => 'Microsoft, июнь 2025']
    ],
    'responses' => [
        'Уровень 3: Активное противодействие DDoS (Mamram перехватил все атаки)',
        'Уровень 2: Усиление защиты инфраструктуры (утроение атак с октября 2023)',
        'Уровень 1: Мониторинг новых угроз (Иран за 64% атак)',
        'Предупреждение: Вероятность эскалации (170 групп атакуют Израиль)'
    ]
];

// --- 2. Расчёт AAL и вклада ---
$aal = (int)$cyber['aal'];
$contribution = round($aal * 1.08, 1); // 5.4 / 5 = 1.08

// --- 3. Синхронизация с total_index.json ---
$total_file = __DIR__ . '/total_index.json';
$total = ['factors'=>[], 'total_aal'=>1.0, 'last_update'=>date('d.m.Y H:i').' UTC', 'factor_count'=>0];
if (file_exists($total_file)) {
    $json = file_get_contents($total_file);
    $tmp = json_decode($json, true);
    if (json_last_error() === JSON_ERROR_NONE) {
        $total = $tmp;
    }
}
$total['factors']['cyber'] = [
    'aal' => $aal,
    'last_update' => $cyber['last_update'],
    'contribution' => $contribution
];
$sum = $cnt = 0;
foreach ($total['factors'] as $f) {
    if (isset($f['aal'])) {
        $sum += $f['aal'];
        $cnt++;
    }
}
$total['total_aal'] = $cnt ? round($sum / $cnt, 2) : 1.0;
$total['factor_count'] = $cnt;
$total['last_update'] = date('d.m.Y H:i').' UTC';
file_put_contents($total_file, json_encode($total, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));

// --- 4. JS-данные ---
$js_data = json_encode([
    'chart_data' => $cyber['chart_data'],
    'aal_color' => $cyber['aal_color'],
    'last_update' => $cyber['last_update']
], JSON_UNESCAPED_UNICODE);
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Киберугрозы | Avatiah Security Index</title>
    <meta name="description" content="AAL <?= $aal ?>. Инцидентов за 24ч: <?= $cyber['incidents_24h'] ?>. <?= $cyber['last_update'] ?>">
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <style>
        :root{--bg:#0a0e1a;--card:#1a2332;--border:#2d3748;--text:#e2e8f0;--green:#10b981;--yellow:#f59e0b;--orange:#f97316;--red:#ef4444;--darkred:#dc2626;--accent:#2ecc71;--font-base:1rem;--font-sm:.875rem;--font-xs:.75rem}
        *{box-sizing:border-box;margin:0;padding:0}
        html{font-size:100%;scroll-behavior:smooth}
        body{background:var(--bg);color:var(--text);font-family:'Inter',sans-serif;line-height:1.6;padding:clamp(.5rem,2vw,1rem);min-height:100vh;display:flex;flex-direction:column}
        .container{max-width:1600px;margin:0 auto;display:grid;gap:clamp(1rem,2.5vw,1.5rem)}
        @media(min-width:768px){.container{grid-template-columns:1fr 340px}}
        @media(min-width:1200px){.container{grid-template-columns:1fr 360px}}
        .section{background:var(--card);border-radius:12px;padding:clamp(1rem,2.5vw,1.5rem);border:1px solid var(--border)}
        .header{background:linear-gradient(135deg,#27ae60,#2ecc71);color:#fff;padding:clamp(1.5rem,4vw,2rem);border-radius:16px;text-align:center}
        .header h1{font-size:clamp(1.8rem,5vw,2.8rem);margin-bottom:.5rem}
        .header p{font-size:clamp(.9rem,2vw,1rem);opacity:.9}
        .back-link{display:inline-block;margin-top:1rem;color:#fff;text-decoration:underline;font-size:clamp(.8rem,1.8vw,.9rem)}
        .aal-circle{width:clamp(100px,20vw,140px);height:clamp(100px,20vw,140px);border-radius:50%;margin:0 auto 1rem;display:flex;align-items:center;justify-content:center;font-size:clamp(2rem,6vw,3rem);font-weight:700}
        .aal-info{text-align:center}
        .aal-info h2{font-size:clamp(1.3rem,4vw,1.8rem);margin:.5rem 0}
        .aal-stats{display:flex;flex-wrap:wrap;justify-content:center;gap:.75rem;margin:.75rem 0;font-size:clamp(.85rem,2vw,.95rem)}
        .sources{text-align:center;font-size:var(--font-xs);color:#94a3b8;margin-top:.5rem}
        .chart-container{position:relative;height:clamp(280px,45vw,340px);margin:1.5rem 0;background:rgba(255,255,255,.05);border-radius:8px;padding:1rem}
        .aal-scale{display:grid;grid-template-columns:repeat(5,1fr);gap:.5rem;margin:1rem 0}
        .scale-item{padding:clamp(.6rem,1.5vw,.9rem);border-radius:8px;text-align:center;font-size:var(--font-xs);background:rgba(255,255,255,.03)}
        .scale-item.active{border:2px solid #fff}
        .scale-item div:first-child{font-weight:700;font-size:1.1em}
        .data-table{width:100%;border-collapse:collapse;margin:1rem 0;font-size:var(--font-sm)}
        .data-table th,.data-table td{padding:.75rem;text-align:left;border-bottom:1px solid var(--border)}
        .data-table th{background:rgba(255,255,255,.05);font-weight:600}
        .count-indicator{font-size:3rem;font-weight:bold;text-align:center;margin:1rem 0;color:var(--accent)}
        .incident-item{padding:1rem;border-bottom:1px solid var(--border)}
        .incident-item:last-child{border-bottom:none}
        .incident-type{color:var(--accent);font-weight:600}
        .incident-severity{display:inline-block;padding:.2rem .6rem;border-radius:12px;font-size:.8rem;margin-left:.5rem}
        .severity-high{background:var(--red);color:#fff}
        .severity-medium{background:var(--orange);color:#fff}
        .severity-low{background:var(--yellow);color:#fff}
        .metric-highlight{background:rgba(46,204,113,.1);padding:1rem;border-radius:8px;border-left:4px solid var(--accent);margin:1rem 0}
        .response-list{list-style:none;padding:0}
        .response-item{padding:.5rem 0;border-bottom:1px solid var(--border)}
        .response-item:last-child{border-bottom:none}
        .sidebar .section{margin-bottom:1rem}
        .sidebar h3{font-size:clamp(1rem,2.5vw,1.1rem);margin-bottom:.5rem}
        .aal-thresholds{display:flex;flex-direction:column;gap:.4rem;margin-top:.5rem}
        .threshold{display:flex;align-items:center;font-size:.85rem}
        .threshold-bar{width:100%;height:8px;background:#334155;border-radius:4px;overflow:hidden;margin-left:.5rem}
        .threshold-fill{height:100%;transition:width .3s ease}
        .threshold-1 .threshold-fill{background:var(--green);width:20%}
        .threshold-2 .threshold-fill{background:var(--yellow);width:40%}
        .threshold-3 .threshold-fill{background:var(--orange);width:60%}
        .threshold-4 .threshold-fill{background:var(--red);width:80%}
        .threshold-5 .threshold-fill{background:var(--darkred);width:100%}
        .current-aal{font-weight:700}
        .footer{margin-top:auto;background:#111827;padding:clamp(1.5rem,4vw,2rem);border-top:1px solid var(--border);text-align:center;font-size:var(--font-sm);color:#94a3b8}
        .footer a{color:inherit;text-decoration:underline}
        .update-status{font-size:.8rem;color:var(--green);text-align:center;margin-top:.5rem}
        @media(max-width:480px){.aal-stats{flex-direction:column;align-items:center}.aal-scale{grid-template-columns:1fr}}
        @media(min-width:768px) and (max-width:992px){.container{grid-template-columns:1fr}}
    </style>
</head>
<body>
<div class="container">
    <div class="main-content">
        <div class="header">
            <h1>Киберугрозы</h1>
            <p>DDoS • Фишинг • Утечки | <span id="last-update"><?= htmlspecialchars($cyber['last_update']) ?></span></p>
            <a href="/" class="back-link">Назад к индексу</a>
        </div>

        <div class="section">
            <div class="aal-info">
                <div class="aal-circle" id="aal-circle" style="background:<?= $cyber['aal_color'] ?>"><?= $aal ?>.0</div>
                <h2 id="aal-text"><?= htmlspecialchars($cyber['aal_text']) ?></h2>
                <div class="count-indicator" id="incidents-value"><?= $cyber['incidents_24h'] ?></div>
                <div class="aal-stats">
                    <div><strong>За 24ч</strong> инцидентов</div>
                    <div><strong>Норма</strong> (<?= htmlspecialchars($cyber['normal_range']) ?>)</div>
                </div>
            </div>
            <p class="sources">Обновлено: <span id="sources-update"><?= htmlspecialchars($cyber['last_update']) ?></span> | OTX, CERT, OSINT</p>
            <p class="update-status" id="update-status">Обновление через <span id="countdown">30:00</span></p>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Киберактивность (10 дней)</h2>
            <div class="chart-container"><canvas id="cyber-chart"></canvas></div>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Распределение по секторам</h2>
            <table class="data-table">
                <tr><th>Сектор</th><th>Атаки</th><th>Доля</th><th>Векторы</th></tr>
                <?php foreach ($cyber['sectors'] as $s): ?>
                <tr>
                    <td><strong><?= htmlspecialchars($s['name']) ?></strong></td>
                    <td><?= $s['attacks'] ?></td>
                    <td><?= $s['share'] ?>%</td>
                    <td><?= htmlspecialchars($s['vectors']) ?></td>
                </tr>
                <?php endforeach; ?>
            </table>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Активные инциденты</h2>
            <div>
                <?php foreach ($cyber['incidents'] as $i): ?>
                <div class="incident-item">
                    <div class="incident-type">
                        <?= htmlspecialchars($i['type']) ?>
                        <span class="incident-severity severity-<?= $i['severity'] ?>">
                            <?= $i['severity'] === 'high' ? 'Высокая' : ($i['severity'] === 'medium' ? 'Средняя' : 'Низкая') ?>
                        </span>
                    </div>
                    <div><?= htmlspecialchars($i['desc']) ?></div>
                    <div style="color:#94a3b8;font-size:.9rem;">Цель: <?= htmlspecialchars($i['target']) ?></div>
                </div>
                <?php endforeach; ?>
            </div>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Меры реагирования</h2>
            <ul class="response-list">
                <?php foreach ($cyber['responses'] as $r): ?>
                <li class="response-item"><?= htmlspecialchars($r) ?></li>
                <?php endforeach; ?>
            </ul>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Шкала кибервоздействия</h2>
            <div class="aal-scale">
                <div class="scale-item <?= $aal==1?'active':'' ?>" style="background:#10b98120"><div>1</div><div>Норма<br><small>0–1</small></div></div>
                <div class="scale-item <?= $aal==2?'active':'' ?>" style="background:#f59e0b20"><div>2</div><div>Внимание<br><small>2</small></div></div>
                <div class="scale-item <?= $aal==3?'active':'' ?>" style="background:#f9731620"><div>3</div><div>Риск<br><small>3</small></div></div>
                <div class="scale-item <?= $aal==4?'active':'' ?>" style="background:#ef444420"><div>4</div><div>Критично<br><small>4</small></div></div>
                <div class="scale-item <?= $aal==5?'active':'' ?>" style="background:#dc262620"><div>5</div><div>Максимум<br><small>5</small></div></div>
            </div>
        </div>

    </div>

    <div class="sidebar">
        <div class="section">
            <h3>Пороги тревоги (AAL)</h3>
            <div class="aal-thresholds">
                <div class="threshold threshold-1"><span>1 – Норма</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-2"><span>2 – Внимание</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-3"><span>3 – Риск</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-4"><span>4 – Критично</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-5"><span>5 – Максимум</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
            </div>
            <p style="margin-top:.5rem;font-size:.8rem;text-align:center;">Текущий: <span class="current-aal"><?= $aal ?>.0</span></p>
        </div>

        <div class="section">
            <h3>Статистика</h3>
            <p><strong>Инцидентов:</strong> <span id="stats-incidents"><?= $cyber['incidents_24h'] ?></span></p>
            <p><strong>Норма:</strong> <?= htmlspecialchars($cyber['normal_range']) ?></p>
            <p><strong>Тренд:</strong> <?= htmlspecialchars($cyber['trend']) ?></p>
            <p><strong>Вклад:</strong> <?= $contribution ?>/10</p>
        </div>

        <div class="section">
            <h3>Мониторинг</h3>
            <p><strong>Источники:</strong> OTX, CERT, OSINT</p>
            <p><strong>Частота:</strong> каждые 30 мин</p>
        </div>

        <div class="section">
            <h3>Связанные факторы</h3>
            <p><a href="darknet.php" style="color:var(--accent)">Даркнет</a></p>
            <p><a href="energy.php" style="color:var(--accent)">Энергия</a></p>
            <p><a href="gov.php" style="color:var(--accent)">Правительство</a></p>
        </div>

        <div class="section">
            <h3>Обновление</h3>
            <p><strong>Последнее:</strong> <span id="sidebar-update"><?= date('H:i') ?></span></p>
            <p><strong>Следующее:</strong> <span id="next-update">--:--</span></p>
        </div>
    </div>
</div>

<div class="footer">
    <p><strong>Avatiah Security Index</strong> — OSINT-аналитика в реальном времени</p>
    <p>© 2025 Avatiah • <?= date('d.m.Y H:i') ?></p>
</div>

<script>
const js = <?= $js_data ?>;
let chart;

/* ---------- Инициализация графика ---------- */
function initChart() {
    const ctx = document.getElementById('cyber-chart').getContext('2d');
    chart = new Chart(ctx, {
        type: 'line',
        data: {
            labels: ['-10д','-9д','-8д','-7д','-6д','-5д','-4д','-3д','-2д','-1д','сегодня'],
            datasets: [{
                label: 'Инциденты',
                data: js.chart_data,
                borderColor: '#2ecc71',
                backgroundColor: 'rgba(46,204,113,0.1)',
                fill: true,
                tension: 0.4,
                pointRadius: 3
            }]
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            plugins: { legend: { display: false } },
            scales: {
                y: {
                    beginAtZero: true,
                    max: 5,
                    ticks: { stepSize: 1 }
                }
            }
        }
    });
}

/* ---------- Обновление без перезагрузки ---------- */
async function updateData() {
    try {
        await fetch('fetch_cyber.php?' + Date.now());
        const r = await fetch('cyber_cache.json?' + Date.now());
        const data = await r.json();

        document.getElementById('last-update').textContent = data.last_update;
        document.getElementById('aal-circle').textContent = data.aal + '.0';
        document.getElementById('aal-circle').style.background = data.aal_color;
        document.getElementById('aal-text').textContent = data.aal_text;
        document.getElementById('incidents-value').textContent = data.incidents_24h;
        document.getElementById('stats-incidents').textContent = data.incidents_24h;
        document.getElementById('sidebar-update').textContent = new Date().toTimeString().slice(0,5);

        chart.data.datasets[0].data = data.chart_data;
        chart.update('quiet');

        document.getElementById('update-status').textContent = 'Обновлено!';
        setTimeout(() => document.getElementById('update-status').textContent = 'Обновление через 30:00', 3000);
    } catch (e) {
        console.error('Ошибка обновления:', e);
    }
}

/* ---------- Таймер обновления ---------- */
const UPDATE_INTERVAL_MINUTES = <?= $update_interval ?>;
let countdownInterval;
function startCountdown() {
    const now = Date.now();
    const next = Math.ceil(now / (UPDATE_INTERVAL_MINUTES * 60 * 1000)) * (UPDATE_INTERVAL_MINUTES * 60 * 1000);
    let remaining = next - now;

    countdownInterval = setInterval(() => {
        remaining -= 1000;
        const min = String(Math.floor(remaining / 60000)).padStart(2, '0');
        const sec = String(Math.floor((remaining % 60000) / 1000)).padStart(2, '0');
        document.getElementById('countdown').textContent = `${min}:${sec}`;
        document.getElementById('next-update').textContent = new Date(next).toTimeString().slice(0, 5);

        if (remaining <= 0) {
            clearInterval(countdownInterval);
            updateData().then(startCountdown);
        }
    }, 1000);
}

/* Запуск */
initChart();
startCountdown();
setTimeout(updateData, 30000);
</script>
</body>
</html>