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=block
  • Referrer-Policy: strict-origin-when-cross-origin
  • Strict-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:

  1. Maintenance Shield: Blocca l’app se il DB segnala maintenance_mode = true.
  2. Feature Gating: Controlla l’esistenza delle route rispetto al database. Se disabilitate, restituisce un redirect hardcode a 302, non un semplice “nascondere in UI”.
  3. 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