Una CSP rigorosa non consente unsafe evaluation
Cosa significa?
La Content Security Policy (CSP) è una policy di sicurezza che indica ai browser quali tipi di codice possono essere eseguiti su una pagina web. La direttiva unsafe-eval controlla in particolare se il JavaScript può essere generato ed eseguito dinamicamente a runtime, ad esempio tramite eval() o il costruttore Function(). Una CSP rigorosa che non consente unsafe-eval blocca esattamente questo tipo di esecuzione dinamica del codice nel browser. Questo vale non solo per il codice del sito web stesso, ma anche per gli strumenti esterni che ricaricano ed eseguono contenuti a runtime, come nel caso degli strumenti di A/B testing lato client.
La creazione e la distribuzione funzionano anche senza unsafe-eval?
No, tecnicamente parlando, creare e distribuire esperimenti non è possibile senza unsafe-eval. Il motivo sta nel modo in cui funziona lo snippet stesso: gli esperimenti non vengono incorporati staticamente al momento della pubblicazione della pagina, ma vengono recuperati dallo snippet come configurazione in fase di runtime ed eseguiti nel browser da un motore JavaScript. È esattamente questo che rende possibile creare o modificare un esperimento nella dashboard senza richiedere una nuova distribuzione da parte del cliente.
Tuttavia, una CSP può consentire solo codice che conosce in anticipo, tramite una fonte fissa, un hash o un nonce. Nessuno di questi metodi funziona per contenuti che vengono assemblati solo dopo il caricamento della pagina. Perché il browser esegua comunque questo codice, ha bisogno di eval() o del costruttore Function()—esattamente ciò che unsafe-eval controlla. Poiché la logica di targeting e le modifiche ai contenuti passano attraverso lo stesso motore, non esiste un percorso di esecuzione separato e “sicuro” che potrebbe essere attivato esclusivamente per esperimenti semplici (testo, CSS, immagini).
Possibile soluzione
Invece di consentire unsafe-eval su tutto il sito, la CSP può essere configurata diversamente per ciascuna route. Le pagine con requisiti particolarmente rigidi (ad es. flussi di login o autenticazione) rimangono strettamente eval-free, mentre unsafe-eval viene consentito solo sulle pagine in cui gli esperimenti sono effettivamente destinati a essere eseguiti.