1
Stack Tecnologico
Backend
PHP 8.4 — vanilla, Front Controller pattern, zero dipendenze framework. Router personalizzato con pattern matching per URI gerarchici.
Database
MySQL 8.0 — 22 tabelle, indici ottimizzati, soft delete, trigger immutabili su audit_log. PDO con prepared statements.
Frontend
HTML5 / CSS3 / JavaScript — vanilla, nessun framework JS. 17 pagine HTML + 3 admin. CSS custom ~1.600 righe. i18n IT/EN integrato.
Autenticazione
JWT HS256 — access token 2h, refresh token 7d. Refresh atomico con SELECT FOR UPDATE. Idle timeout 30min con avviso.
AI Integration
Anthropic Claude — modello claude-sonnet-4-5. Prompt anonimizzati (no ragione sociale, no fatturato). 4 funzionalità AI.
Infrastruttura
Hetzner CPX31 — Ubuntu, Apache 2.4, subdomain dedicato. Docker-ready (Dockerfile + nginx.conf inclusi).
2
Architettura Sistema
Browser
HTML5 Pages
api.js Client
i18n.js IT/EN
common.js Utils
help.js
↓ HTTPS / JWT Bearer
Router
public/index.php — Front Controller
.htaccess Rewrite
↓ /api/{controller}/{action}/{id?}
Controllers
Auth
Assessment
Risk
Incident
Policy
SupplyChain
Audit
+ 8 altri
↓ PDO / Services
Services
AIService (Claude)
EmailService
ReportService
RateLimitService
VisuraService
↓ PDO Singleton
Database
MySQL 8.0 — nis2_agile_db — 22 tabelle
3
API REST — Endpoint Principali
Base URL: https://nis2.certisource.it/api/{controller}/{action}/{id?} — Auth: Bearer JWT + X-Organization-Id header
| Modulo | Metodo | Endpoint | Descrizione |
|---|---|---|---|
| Auth | POST | /auth/login, /register, /refresh | Login, registrazione, rinnovo token JWT |
| Auth | GET | /auth/me | Dati utente autenticato e organizzazioni |
| Organizations | POST | /organizations/create, /classify | Crea org, classifica soggetto NIS2 |
| Assessment | GET | /assessments/{id}/questions | 80 domande gap analysis (10 categorie Art.21) |
| Assessment | POST | /assessments/{id}/ai-analyze | Analisi AI dei gap con raccomandazioni |
| Risks | GET | /risks/matrix | Matrice rischi 5×5 aggregata |
| Risks | POST | /risks/ai-suggest | Suggerimenti rischi AI per settore/asset |
| Incidents | POST | /incidents/{id}/early-warning | Early warning CSIRT entro 24h (Art.23) |
| Incidents | POST | /incidents/{id}/final-report | Report finale CSIRT entro 30gg (Art.23) |
| Policies | POST | /policies/ai-generate | Genera policy NIS2 con AI (per categoria) |
| Audit | GET | /audit/executive-report | Report esecutivo HTML stampabile |
| Audit | GET | /audit/export?type=risks | Export CSV (rischi/incidenti/controlli/asset) |
| NCR/CAPA | POST | /ncr/from-assessment | Genera NCR automatiche dai gap assessment |
| Onboarding | POST | /onboarding/upload-visura | Estrazione AI da PDF visura camerale |
4
Schema Database — 22 Tabelle
organizations
Tenant principale + classificazione NIS2
users
Utenti (7 ruoli, multi-org)
user_organizations
Mapping utente↔org + ruolo
refresh_tokens
Token refresh JWT indicizzati
assessments
Sessioni gap analysis
assessment_responses
Risposte singole domande
risks
Register rischi (soft delete)
risk_treatments
Piani di trattamento
incidents
Incidenti + flag significativo
incident_timeline
Aggiornamenti e notifiche
policies
Policy (soft delete, versioning)
suppliers
Fornitori catena approvv.
training_courses
Catalogo corsi formazione
training_assignments
Assegnazioni e completamenti
assets
Inventario ICT (4 tipi)
compliance_controls
Controlli NIS2 per org
evidence_files
Allegati e documenti audit
audit_logs
Log immutabili (trigger MySQL)
ai_interactions
Storico chiamate API AI
email_log
Log notifiche email CSIRT
non_conformities
NCR — Non Conformity Reports
corrective_actions
CAPA — Azioni correttive
5
Sicurezza Applicativa
JWT + Refresh Token Atomico
Access token 2h, refresh 7d. Rinnovo con SELECT FOR UPDATE (no race conditions). Revoca token al logout.
CORS Configurato
No wildcard. Origin verificata contro lista bianca configurabile. Header personalizzati sicuri.
Rate Limiting
File-based per IP (proxy-aware, X-Forwarded-For). Login: 5/min, 20/h. Register: 3/10min. AI: 10/min.
SQL Injection Prevention
PDO esclusivo con prepared statements. Nessuna concatenazione di query. Input validato lato server.
XSS Prevention
escapeHtml() su ogni output frontend. Content-Security-Policy header configurato.
Audit Log Immutabile
Trigger MySQL prevent_update + prevent_delete su audit_logs. Ogni operazione registrata con utente, azione e timestamp.
AI Data Privacy
Prompt anonimizzati: ragione sociale e fatturato mai inviati ad Anthropic. Dipendenti convertiti in range (micro/piccola/media/grande).
Idle Session Timeout
Logout automatico dopo 30 min di inattività. Avviso con countdown 5 min. Monitoraggio eventi mouse/keyboard/scroll.
6
Performance Target
<1s
secondi
Caricamento Dashboard
<2s
secondi
Report Compliance
100+
rischi
Matrice Fluida
∞
tenant
Multi-Tenant Isolati
7
Opzioni di Deploy
8
Copertura Normativa NIS2
Art. 20
Governance — Formazione obbligatoria management, responsabilità organi
Art. 21.1
Risk-based approach — Risk register, matrice rischi, trattamenti
Art. 21.2(a)
Politiche sicurezza — Gap analysis 80 domande, policy management
Art. 21.2(b)
Gestione incidenti — Ciclo di vita, classificazione AI, timeline
Art. 21.2(c)
Business continuity — Asset inventory, dipendenze, backup
Art. 21.2(d)
Supply chain — Registro fornitori, valutazione rischio, scoring
Art. 21.2(g)
Formazione — Training management, compliance tracking, report
Art. 23
Notifica incidenti — Early warning 24h, notifica 72h, report 30gg
Art. 32-33
Vigilanza — Audit log immutabili, evidenze, controlli compliance
D.Lgs. 138/2024
Recepimento italiano NIS2 — Classificazione soggetti, settori