[FEAT] Integrazione analisi docs/nis2 v1.7.0 — scoring asset, tassonomia incidenti, PIR, NIST CSF, fonti certe

Fase 1 - Asset Relevance Scoring NIS2 (GV.OC-04): metodologia 0-100 a 6 criteri,
  AssetScoringService + endpoint scoringGrid/score/relevantSystems + UI assets.html + registro stampabile.
Fase 2 - Tassonomia incidenti Determina ACN 164179/2025: IS-1..4 + regime essenziale/importante (Allegati 3/4).
Fase 3 - Post-Incident Review (5-Whys) + metriche TTD/TTC/TTR + timestamp di fase.
Fase 4 - Mapping NIST CSF 2.0 (43 controlli) reference-only.
Fonti certe: registry config/nis2_sources.php + grounding AI (vieta riferimenti inventati) +
  citazioni help.js + ingest PDF normativi nella KB RAG (scripts/ingest-nis2-sources.php).
Migrazioni 020/021/022 (additive idempotenti). Fix VectorService IP Qdrant (drift .5->.3).
Analisi concorrenza Evix (docs/EVIX_ANALISI_CONCORRENZA.html, gap-driven).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-05-29 17:15:13 +02:00
co-authored by Claude Opus 4.8
parent a7a21faa82
commit 5c545ea3d0
41 changed files with 21078 additions and 24 deletions
+956
View File
@@ -0,0 +1,956 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nuovo Incidente - NIS2 Management System</title>
<style>
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #1c2128;
--border-color: #30363d;
--text-primary: #c9d1d9;
--text-secondary: #8b949e;
--accent-primary: #58a6ff;
--accent-secondary: #1f6feb;
--success: #3fb950;
--warning: #d29922;
--danger: #f85149;
--essential-bg: #fef3c7;
--essential-text: #92400e;
--essential-border: #f59e0b;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
overflow-y: auto;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.header {
background-color: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
padding: 24px 0;
margin-bottom: 32px;
position: sticky;
top: 0;
z-index: 100;
}
.header-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
font-size: 24px;
font-weight: 600;
color: var(--text-primary);
}
.breadcrumb {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
}
.breadcrumb a {
color: var(--accent-primary);
text-decoration: none;
}
.btn {
padding: 8px 16px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.btn:hover {
border-color: var(--accent-primary);
color: var(--accent-primary);
}
.form-section {
background-color: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 24px;
margin-bottom: 24px;
}
.form-section-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border-color);
display: flex;
align-items: center;
gap: 8px;
}
.help-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
background-color: rgba(167, 139, 250, 0.2);
border: 2px solid #a78bfa;
border-radius: 50%;
font-size: 13px;
font-weight: 700;
color: #a78bfa;
cursor: help;
position: relative;
}
.help-icon:hover {
background-color: rgba(167, 139, 250, 0.3);
transform: scale(1.1);
}
.tooltip {
visibility: hidden;
position: absolute;
z-index: 1000;
background-color: var(--bg-tertiary);
color: var(--text-primary);
padding: 12px;
border-radius: 6px;
border: 1px solid var(--border-color);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
width: 320px;
top: 28px;
left: 50%;
transform: translateX(-50%);
font-size: 12px;
line-height: 1.5;
opacity: 0;
transition: opacity 0.2s;
white-space: normal;
}
.tooltip::before {
content: '';
position: absolute;
top: -6px;
left: 50%;
transform: translateX(-50%);
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid var(--border-color);
}
.tooltip-title {
color: var(--accent-primary);
font-weight: 600;
margin-bottom: 8px;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.help-icon:hover .tooltip {
visibility: visible;
opacity: 1;
}
.form-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
.form-group {
margin-bottom: 20px;
}
.form-group.full-width {
grid-column: 1 / -1;
}
.form-label {
display: block;
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 8px;
}
.form-label .required {
color: var(--danger);
margin-left: 4px;
}
.form-input, .form-select, .form-textarea {
width: 100%;
padding: 10px 12px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 14px;
font-family: inherit;
}
.form-input:focus, .form-select:focus, .form-textarea:focus {
outline: none;
border-color: var(--accent-primary);
box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.1);
}
.form-textarea {
resize: vertical;
min-height: 100px;
}
.form-help {
font-size: 12px;
color: var(--text-secondary);
margin-top: 6px;
line-height: 1.4;
}
.severity-selector {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 12px;
}
.severity-option {
padding: 16px;
background-color: var(--bg-tertiary);
border: 2px solid var(--border-color);
border-radius: 6px;
cursor: pointer;
text-align: center;
transition: all 0.2s;
}
.severity-option:hover {
border-color: var(--accent-primary);
}
.severity-option.selected {
border-color: var(--accent-primary);
background-color: rgba(88, 166, 255, 0.1);
}
.severity-option.sev-1 {
border-color: var(--danger);
}
.severity-option.sev-1.selected {
background-color: rgba(248, 81, 73, 0.1);
}
.severity-option.sev-2 {
border-color: var(--warning);
}
.severity-option.sev-2.selected {
background-color: rgba(210, 153, 34, 0.1);
}
.severity-label {
font-weight: 700;
font-size: 14px;
margin-bottom: 4px;
}
.severity-desc {
font-size: 11px;
color: var(--text-secondary);
}
.alert-box {
background-color: rgba(88, 166, 255, 0.1);
border: 1px solid var(--accent-primary);
border-left: 4px solid var(--accent-primary);
border-radius: 6px;
padding: 16px;
margin-bottom: 20px;
}
.alert-box.warning {
background-color: rgba(210, 153, 34, 0.1);
border-color: var(--warning);
border-left-color: var(--warning);
}
.alert-box.danger {
background-color: rgba(248, 81, 73, 0.1);
border-color: var(--danger);
border-left-color: var(--danger);
}
.alert-title {
font-weight: 600;
margin-bottom: 8px;
font-size: 14px;
}
.alert-content {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.5;
}
.form-actions {
display: flex;
gap: 12px;
justify-content: flex-end;
padding-top: 24px;
border-top: 1px solid var(--border-color);
}
.btn-primary {
background-color: var(--accent-primary);
border-color: var(--accent-primary);
color: white;
}
.btn-primary:hover {
background-color: var(--accent-secondary);
border-color: var(--accent-secondary);
color: white;
}
.btn-danger {
background-color: var(--danger);
border-color: var(--danger);
color: white;
}
.btn-danger:hover {
background-color: #dc2626;
border-color: #dc2626;
}
.checklist {
list-style: none;
}
.checklist li {
padding: 10px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 4px;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 12px;
}
.checklist input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
}
.essential-badge {
display: inline-block;
background-color: var(--essential-bg);
color: var(--essential-text);
padding: 4px 8px;
border-radius: 3px;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
border: 1px solid var(--essential-border);
margin-left: 8px;
}
@media (max-width: 768px) {
.form-grid {
grid-template-columns: 1fr;
}
.severity-selector {
grid-template-columns: 1fr 1fr;
}
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div>
<h1>🚨 Segnalazione Nuovo Incidente</h1>
<div class="breadcrumb">
<a href="dashboard.html">Dashboard NIS2</a> /
<a href="incident-dashboard.html">Gestione Incidenti</a> /
Nuovo Incidente
</div>
</div>
<a href="incident-dashboard.html" class="btn">← Annulla</a>
</div>
</div>
<div class="container">
<div class="alert-box danger">
<div class="alert-title">⚠️ Procedura di Emergenza</div>
<div class="alert-content">
Per incidenti <strong>SEV-1 (Critici)</strong>: attivare immediatamente il Crisis Team e il CISO.
La notifica al CSIRT Italia (preallarme) deve essere effettuata entro <strong>24 ore</strong> dalla conoscenza dell'incidente significativo.
</div>
</div>
<form id="incidentForm">
<!-- Sezione 1: Rilevazione -->
<div class="form-section">
<div class="form-section-title">
Fase 1: Rilevazione e Segnalazione
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Registrazione iniziale dell'incidente. Compilare entro 15 minuti dalla rilevazione per incidenti critici. Tutte le informazioni possono essere aggiornate durante la gestione.
</div>
</span>
</div>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Data/Ora Rilevazione <span class="required">*</span>
</label>
<input type="datetime-local" class="form-input" id="detectionTime" required>
<div class="form-help">Momento in cui l'incidente è stato rilevato</div>
</div>
<div class="form-group">
<label class="form-label">
Fonte di Rilevazione <span class="required">*</span>
</label>
<select class="form-select" id="detectionSource" required>
<option value="">Seleziona...</option>
<option value="siem">Alert SIEM/SOC</option>
<option value="edr">Alert EDR/Antimalware</option>
<option value="user">Segnalazione Utente</option>
<option value="supplier">Notifica Fornitore/Partner</option>
<option value="csirt">Notifica CSIRT Italia</option>
<option value="threat-intel">Threat Intelligence</option>
<option value="external">Segnalazione Esterna</option>
<option value="monitoring">Monitoraggio Infrastruttura</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Analista Assegnato <span class="required">*</span>
</label>
<select class="form-select" id="analyst" required>
<option value="">Seleziona...</option>
<option value="ciso">CISO</option>
<option value="soc-lead">SOC Lead</option>
<option value="analyst1">Analista Sicurezza 1</option>
<option value="analyst2">Analista Sicurezza 2</option>
<option value="sysadmin">System Administrator</option>
<option value="netadmin">Network Administrator</option>
</select>
</div>
<div class="form-group full-width">
<label class="form-label">
Descrizione Preliminare <span class="required">*</span>
</label>
<textarea class="form-textarea" id="description" required placeholder="Descrizione dettagliata dell'incidente rilevato..."></textarea>
<div class="form-help">Fornire tutti i dettagli disponibili: cosa è stato rilevato, su quali sistemi, sintomi osservati</div>
</div>
<div class="form-group full-width">
<label class="form-label">
Sistemi Potenzialmente Impattati
</label>
<input type="text" class="form-input" id="affectedSystems" placeholder="es. HW-SRV-001, SW-ERP-001, CLD-IAAS-001">
<div class="form-help">Codici asset da inventario (Org.01). Separare con virgola se multipli</div>
</div>
</div>
</div>
<!-- Sezione 2: Triage e Classificazione -->
<div class="form-section">
<div class="form-section-title">
Fase 2: Triage e Classificazione
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Determinazione della severità e classificazione secondo NIS2. Completare entro 1 ora per SEV-1/SEV-2. La classificazione determina gli obblighi di notifica al CSIRT.
</div>
</span>
</div>
<div class="form-group full-width">
<label class="form-label">
Severità Incidente <span class="required">*</span>
</label>
<div class="severity-selector">
<div class="severity-option sev-1" onclick="selectSeverity('sev-1')">
<div class="severity-label" style="color: var(--danger);">SEV-1</div>
<div class="severity-desc">CRITICO</div>
</div>
<div class="severity-option sev-2" onclick="selectSeverity('sev-2')">
<div class="severity-label" style="color: var(--warning);">SEV-2</div>
<div class="severity-desc">ALTO</div>
</div>
<div class="severity-option" onclick="selectSeverity('sev-3')">
<div class="severity-label" style="color: var(--accent-primary);">SEV-3</div>
<div class="severity-desc">MEDIO</div>
</div>
<div class="severity-option" onclick="selectSeverity('sev-4')">
<div class="severity-label" style="color: var(--text-secondary);">SEV-4</div>
<div class="severity-desc">BASSO</div>
</div>
</div>
<input type="hidden" id="severity" required>
<div class="form-help" id="severityHelp" style="margin-top: 12px;"></div>
</div>
<div class="alert-box warning" id="sev1Alert" style="display: none;">
<div class="alert-title">🚨 Incidente SEV-1 - Azioni Immediate Richieste</div>
<div class="alert-content">
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Attivare immediatamente Crisis Team</li>
<li>Notificare CISO e Direzione</li>
<li>Contenimento entro 30 minuti</li>
<li>Preallarme CSIRT entro 24h (se significativo)</li>
</ul>
</div>
</div>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Classificazione NIS2 <span class="required">*</span>
</label>
<select class="form-select" id="classification" required onchange="updateClassificationHelp()">
<option value="">Seleziona...</option>
<option value="is-1">IS-1 - Impatto su servizi rilevanti</option>
<option value="is-2">IS-2 - Impatto su integrità/riservatezza dati</option>
<option value="is-3">IS-3 - Impatto su altri soggetti/supply chain</option>
<option value="is-4" id="is4ClassOption">IS-4 - Incidente ricorrente (SOLO ESSENZIALI)</option>
<option value="not-significant">Non Significativo</option>
</select>
<div class="form-help" id="classificationHelp"></div>
</div>
<div class="form-group">
<label class="form-label">
Impatto
</label>
<select class="form-select" id="impact" multiple size="4">
<option value="availability">Disponibilità</option>
<option value="integrity">Integrità</option>
<option value="confidentiality">Riservatezza</option>
<option value="authenticity">Autenticità</option>
</select>
<div class="form-help">Tenere premuto Ctrl/Cmd per selezione multipla</div>
</div>
<div class="form-group">
<label class="form-label">
Categoria MITRE ATT&CK
</label>
<select class="form-select" id="mitreCategory">
<option value="">Non determinata</option>
<option value="initial-access">Initial Access</option>
<option value="execution">Execution</option>
<option value="persistence">Persistence</option>
<option value="privilege-escalation">Privilege Escalation</option>
<option value="defense-evasion">Defense Evasion</option>
<option value="credential-access">Credential Access</option>
<option value="discovery">Discovery</option>
<option value="lateral-movement">Lateral Movement</option>
<option value="collection">Collection</option>
<option value="exfiltration">Exfiltration</option>
<option value="impact">Impact</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Vettore di Attacco
</label>
<select class="form-select" id="attackVector">
<option value="">Non determinato</option>
<option value="phishing">Phishing/Spear Phishing</option>
<option value="malware">Malware</option>
<option value="ransomware">Ransomware</option>
<option value="vulnerability">Exploit Vulnerabilità</option>
<option value="brute-force">Brute Force</option>
<option value="credential-stuffing">Credential Stuffing</option>
<option value="supply-chain">Supply Chain Attack</option>
<option value="ddos">DDoS</option>
<option value="insider">Insider Threat</option>
<option value="physical">Accesso Fisico</option>
<option value="social-engineering">Social Engineering</option>
</select>
</div>
</div>
<div class="alert-box" id="csirtAlert" style="display: none;">
<div class="alert-title">📡 Notifica CSIRT Obbligatoria</div>
<div class="alert-content">
Questo incidente rientra nella classificazione di incidente significativo secondo NIS2.
È obbligatorio inviare il <strong>preallarme al CSIRT Italia entro 24 ore</strong> dalla conoscenza dell'incidente.
<br><br>
Dopo la creazione dell'incidente, procedere alla sezione "Notifiche CSIRT" per gestire le comunicazioni obbligatorie.
</div>
</div>
</div>
<!-- Sezione 3: Dati Impattati -->
<div class="form-section">
<div class="form-section-title">
Dati e Servizi Impattati
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Identificazione dei dati e servizi coinvolti nell'incidente. Fondamentale per valutare obblighi GDPR e impatto operativo.
</div>
</span>
</div>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Dati Personali Coinvolti?
</label>
<select class="form-select" id="personalData" onchange="toggleGDPR()">
<option value="no">No</option>
<option value="yes">Sì</option>
<option value="unknown">Da verificare</option>
</select>
</div>
<div class="form-group" id="gdprGroup" style="display: none;">
<label class="form-label">
Notifica Garante Privacy
</label>
<select class="form-select" id="gdprNotification">
<option value="not-required">Non richiesta</option>
<option value="required">Richiesta (entro 72h)</option>
<option value="sent">Già inviata</option>
</select>
<div class="form-help">Art. 33 GDPR - coordinare con DPO</div>
</div>
<div class="form-group full-width">
<label class="form-label">
Servizi Rilevanti NIS2 Impattati
</label>
<input type="text" class="form-input" id="affectedServices" placeholder="Codici servizi da catalogo (ID.AM-04)">
<div class="form-help">Elencare i servizi rilevanti NIS2 che hanno subito interruzione o degrado</div>
</div>
<div class="form-group">
<label class="form-label">
Numero Utenti Impattati (stima)
</label>
<input type="number" class="form-input" id="usersImpacted" min="0">
</div>
<div class="form-group">
<label class="form-label">
Impatto Economico Stimato (€)
</label>
<input type="number" class="form-input" id="financialImpact" min="0" step="100">
<div class="form-help">Stima preliminare (diretto + indiretto)</div>
</div>
</div>
</div>
<!-- Sezione 4: Azioni Immediate -->
<div class="form-section">
<div class="form-section-title">
Azioni Immediate di Contenimento
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Checklist delle azioni di contenimento immediato. Per SEV-1: contenimento entro 30 minuti. Documentare ogni azione con timestamp.
</div>
</span>
</div>
<ul class="checklist">
<li>
<input type="checkbox" id="action1">
<label for="action1">Sistema compromesso isolato dalla rete</label>
</li>
<li>
<input type="checkbox" id="action2">
<label for="action2">Account compromessi bloccati</label>
</li>
<li>
<input type="checkbox" id="action3">
<label for="action3">IP/domini malevoli bloccati su firewall</label>
</li>
<li>
<input type="checkbox" id="action4">
<label for="action4">Evidenze preservate (snapshot, log, memoria)</label>
</li>
<li>
<input type="checkbox" id="action5">
<label for="action5">Monitoraggio intensivo attivato su sistemi correlati</label>
</li>
<li>
<input type="checkbox" id="action6">
<label for="action6">Crisis Team / IRT notificato</label>
</li>
<li>
<input type="checkbox" id="action7">
<label for="action7">Direzione informata (per SEV-1/SEV-2)</label>
</li>
</ul>
<div class="form-group" style="margin-top: 20px;">
<label class="form-label">
Note Azioni di Contenimento
</label>
<textarea class="form-textarea" id="containmentNotes" placeholder="Descrivere in dettaglio le azioni di contenimento effettuate con timestamp..."></textarea>
</div>
</div>
<!-- Sezione 5: Collegamento Risk -->
<div class="form-section">
<div class="form-section-title">
Collegamento Risk Assessment
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Collegare l'incidente a rischi già identificati nel risk assessment (Org.05). Se l'incidente evidenzia un nuovo rischio, verrà creato automaticamente.
</div>
</span>
</div>
<div class="form-group">
<label class="form-label">
Collegamento N°RISK
</label>
<input type="text" class="form-input" id="riskId" placeholder="es. RISK-2024-015">
<div class="form-help">Codice rischio da Org.05 - Risk Assessment. Lasciare vuoto se nuovo rischio</div>
</div>
<div class="form-group">
<label class="form-label">
Root Cause Preliminare
</label>
<select class="form-select" id="rootCause">
<option value="">Da determinare</option>
<option value="vulnerability">Vulnerabilità non patchata</option>
<option value="misconfiguration">Errore di configurazione</option>
<option value="weak-credentials">Credenziali deboli/compromesse</option>
<option value="missing-controls">Controlli di sicurezza mancanti</option>
<option value="human-error">Errore umano</option>
<option value="third-party">Compromissione terza parte</option>
<option value="zero-day">Zero-day exploit</option>
<option value="insider">Insider threat</option>
</select>
</div>
</div>
<!-- Form Actions -->
<div class="form-section">
<div class="form-actions">
<a href="incident-dashboard.html" class="btn">Annulla</a>
<button type="button" class="btn" onclick="saveDraft()">Salva Bozza</button>
<button type="submit" class="btn btn-danger">🚨 Crea Incidente e Attiva Gestione</button>
</div>
</div>
</form>
</div>
<script>
// Verifica tipo soggetto
function checkSubjectType() {
const subjectType = sessionStorage.getItem('nis2_subject_type');
if (!subjectType) {
window.location.href = 'incident-gate.html';
return;
}
// Nascondi IS-4 per soggetti importanti
if (subjectType === 'important') {
const is4Option = document.getElementById('is4ClassOption');
if (is4Option) is4Option.style.display = 'none';
}
}
// Imposta data/ora corrente
function setCurrentDateTime() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
document.getElementById('detectionTime').value = `${year}-${month}-${day}T${hours}:${minutes}`;
}
// Selezione severità
function selectSeverity(severity) {
// Rimuovi selezione precedente
document.querySelectorAll('.severity-option').forEach(opt => {
opt.classList.remove('selected');
});
// Seleziona nuovo
event.target.closest('.severity-option').classList.add('selected');
document.getElementById('severity').value = severity;
// Mostra help specifico
const helpTexts = {
'sev-1': '🚨 <strong>CRITICO:</strong> Interruzione totale servizio critico, ransomware attivo, esfiltrazione massiva dati, compromissione infrastruttura core. <strong>Attivazione immediata Crisis Team.</strong>',
'sev-2': '⚠️ <strong>ALTO:</strong> Interruzione parziale servizio rilevante, compromissione account privilegiato, malware attivo non contenuto, accesso non autorizzato a dati riservati.',
'sev-3': 'ℹ️ <strong>MEDIO:</strong> Degrado prestazioni servizio rilevante, malware contenuto automaticamente, tentativo intrusione bloccato ma significativo.',
'sev-4': '📝 <strong>BASSO:</strong> Anomalia senza impatto operativo, tentativo attacco bloccato (routine), violazione policy minore.'
};
document.getElementById('severityHelp').innerHTML = helpTexts[severity];
// Mostra alert per SEV-1
const sev1Alert = document.getElementById('sev1Alert');
if (severity === 'sev-1') {
sev1Alert.style.display = 'block';
} else {
sev1Alert.style.display = 'none';
}
}
// Aggiorna help classificazione
function updateClassificationHelp() {
const classification = document.getElementById('classification').value;
const helpTexts = {
'is-1': 'Interruzione operativa o degrado significativo di un servizio rilevante NIS2. <strong>Notifica CSIRT obbligatoria.</strong>',
'is-2': 'Accesso non autorizzato, modifica, esfiltrazione o violazione riservatezza dati. <strong>Notifica CSIRT obbligatoria.</strong> Verificare anche obbligo GDPR.',
'is-3': 'Incidente che si propaga a soggetti terzi o impatta la catena di fornitura. <strong>Notifica CSIRT obbligatoria.</strong>',
'is-4': 'Serie di incidenti correlati con impatto cumulativo significativo. <strong>Notifica CSIRT obbligatoria SOLO per soggetti ESSENZIALI.</strong>',
'not-significant': 'Incidente gestito internamente, senza obbligo di notifica CSIRT. Documentare comunque nel registro incidenti.'
};
const helpElement = document.getElementById('classificationHelp');
helpElement.innerHTML = helpTexts[classification] || '';
// Mostra/nascondi alert CSIRT
const csirtAlert = document.getElementById('csirtAlert');
if (['is-1', 'is-2', 'is-3', 'is-4'].includes(classification)) {
csirtAlert.style.display = 'block';
} else {
csirtAlert.style.display = 'none';
}
}
// Toggle GDPR
function toggleGDPR() {
const personalData = document.getElementById('personalData').value;
const gdprGroup = document.getElementById('gdprGroup');
if (personalData === 'yes') {
gdprGroup.style.display = 'block';
} else {
gdprGroup.style.display = 'none';
}
}
// Salva bozza
function saveDraft() {
alert('Bozza salvata con successo. Puoi continuare la compilazione in seguito.');
}
// Submit form
document.getElementById('incidentForm').addEventListener('submit', function(e) {
e.preventDefault();
// Validazione
const severity = document.getElementById('severity').value;
if (!severity) {
alert('Seleziona la severità dell\'incidente');
return;
}
// Genera codice incidente
const year = new Date().getFullYear();
const progressive = Math.floor(Math.random() * 900) + 100; // Simulato
const incidentCode = `INC-${year}-${progressive}`;
// Simula creazione incidente
const tooltip = document.createElement('div');
tooltip.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--bg-secondary);
border: 2px solid var(--success);
border-radius: 8px;
padding: 32px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
z-index: 10000;
max-width: 500px;
text-align: center;
`;
tooltip.innerHTML = `
<div style="font-size: 48px; margin-bottom: 16px;">✅</div>
<h2 style="color: var(--success); margin-bottom: 16px;">Incidente Creato con Successo</h2>
<p style="color: var(--text-secondary); margin-bottom: 8px;">Codice incidente:</p>
<p style="font-size: 24px; font-weight: 700; color: var(--text-primary); margin-bottom: 24px; font-family: monospace;">${incidentCode}</p>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 24px; text-align: left;">
<p style="font-size: 13px; color: var(--text-secondary); margin-bottom: 12px;"><strong>Prossime azioni:</strong></p>
<ul style="font-size: 13px; color: var(--text-secondary); margin-left: 20px;">
<li>Incident Response Team notificato</li>
<li>Timeline di gestione avviata</li>
${severity === 'sev-1' ? '<li style="color: var(--danger); font-weight: 600;">Crisis Team attivato</li>' : ''}
${['is-1', 'is-2', 'is-3'].includes(document.getElementById('classification').value) ? '<li style="color: var(--warning); font-weight: 600;">Preallarme CSIRT da inviare entro 24h</li>' : ''}
</ul>
</div>
<button onclick="window.location.href='incident-detail.html?id=${incidentCode}'"
style="padding: 12px 24px; background: var(--accent-primary); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer; margin-right: 12px;">
Vai all'Incidente
</button>
<button onclick="window.location.href='incident-dashboard.html'"
style="padding: 12px 24px; background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 6px; color: var(--text-primary); font-weight: 600; cursor: pointer;">
Torna alla Dashboard
</button>
`;
document.body.appendChild(tooltip);
});
// Inizializza
window.addEventListener('DOMContentLoaded', function() {
checkSubjectType();
setCurrentDateTime();
});
</script>
</body>
</html>