Architettura di Sicurezza
Il PMS de Il Carrubo tratta dati altamente sensibili (Documenti d’identità, dati di contatto). Per questo motivo, la sicurezza è applicata a più livelli.
Security Headers
I seguenti HTTP Headers vengono iniettati globalmente tramite il file di configurazione del server (e il vercel.json), proteggendo l’applicazione da vettori di attacco comuni (XSS, Clickjacking, ecc.):
X-Content-Type-Options: nosniff(Previene lo sniffing dei MIME types)X-Frame-Options: DENY(Impedisce che l’app venga caricata in iframe esterni)X-XSS-Protection: 1; mode=blockReferrer-Policy: strict-origin-when-cross-originStrict-Transport-Security: max-age=63072000; includeSubDomains; preload(HSTS: Forza HTTPS per 2 anni)Content-Security-Policy: frame-ancestors 'none';
Edge Middleware
Tutto il traffico in ingresso (su Vercel) passa attraverso l’Edge Middleware middleware.js PRIMA di colpire qualsiasi file statico o route.
Il Middleware assolve a 3 compiti di sicurezza:
- Maintenance Shield: Blocca l’app se il DB segnala
maintenance_mode = true. - Feature Gating: Controlla l’esistenza delle route rispetto al database. Se disabilitate, restituisce un redirect hardcode a 302, non un semplice “nascondere in UI”.
- Admin Shield: Rifiuta le richieste al folder
/ad/senza il corretto JWT e UUID Cookie.
Dual Authentication (API)
L’endpoint principale API (/api/*) è protetto dal middleware Express checkAuth. Esso supporta due flussi concorrenti:
Sicurezza SQL
L’endpoint di debugging o di operatività avanzata /api/querysql permette l’esecuzione di Raw Queries verso Supabase Postgres.
Oltre al normale Auth (Bearer/API Key), richiede tassativamente un campo aggiuntivo password nel corpo della richiesta (POST payload), che viene confrontato crittograficamente con la variabile d’ambiente QUERY_PASSWORD.
Headers per la Cache
Per assicurarsi che gli operatori vedano sempre la versione più recente e che dati sensibili non restino nella cache dei Proxy/ISP:
- Tutti gli HTML:
Cache-Control: public, max-age=0, must-revalidate - File Service Worker:
Cache-Control: public, max-age=0, must-revalidate - Icone e file “immutabili”:
Cache-Control: public, max-age=31536000, immutable