Come JustZix inietta codice su pagine con CSP rigido
Alcune pagine hanno una Content-Security-Policy così rigida da non eseguire alcuno script che il loro autore non abbia scritto. Eppure JustZix può iniettarvi il tuo JS e agganciare l'Output Console al console.log della pagina. Questo articolo spiega come — e perché la prima versione non poteva.
Cos'è la CSP e perché intralcia
La Content-Security-Policy è un header HTTP con cui una pagina dichiara da dove possono essere caricati gli script. Una policy rigida tipica è script-src 'self' — «esegui solo script dal mio dominio». Una policy del genere blocca gli <script> inline: se inietti un tag <script>codice...</script> nel DOM, il browser non lo esegue. È così che funzionano GitHub, le dashboard bancarie e molti siti aziendali.
Il primo approccio — e una regressione
Una versione iniziale dell'hook dell'Output Console (v2.13.72–73) iniettava il codice proprio tramite uno <script> inline aggiunto a <head>. Sulle pagine ordinarie funzionava. Sulle pagine con script-src 'self' il browser rifiutava silenziosamente lo script — l'hook non si agganciava mai, l'Output Console restava vuota. Era una regressione: una funzione che funzionava «nella demo» falliva esattamente dove uno sviluppatore ne ha più bisogno.
La correzione — chrome.scripting.executeScript
La soluzione (v2.13.74) non inietta più un tag <script>. Invece il service worker dell'estensione chiama chrome.scripting.executeScript. È la differenza cruciale: questo script viene eseguito con il privilegio dell'estensione, non a livello di pagina. La CSP della pagina non si applica ad esso — il browser lo tratta come codice di un'estensione fidata a cui l'utente ha acconsentito all'installazione.
Mondo MAIN contro mondo ISOLATED
I content script di un'estensione vivono per impostazione predefinita in un «mondo isolato» (ISOLATED) — hanno un proprio window, separato dalla pagina. È sicuro, ma inutile quando vuoi agganciarti al vero console.log della pagina o toccare le sue variabili globali.
Perciò l'hook atterra nel mondo MAIN — lo stesso contesto JavaScript in cui vive il codice della pagina. Lì può avvolgere console.log/warn/error, collegare listener error e unhandledrejection e vedere esattamente ciò che vede la pagina.
Un ponte tra i mondi — postMessage
L'hook nel mondo MAIN cattura i log, ma la finestra Output Console stessa viene renderizzata da un content script nel mondo ISOLATED. I due mondi non condividono variabili — serve un ponte. Quel ponte è window.postMessage:
- L'hook del mondo MAIN intercetta una voce
console.log. - Serializza gli argomenti e chiama
window.postMessagecon un payload taggato. - Il content script ISOLATED ascolta
message, filtra per tag e renderizza la voce nella finestra Output Console.
postMessage è uno dei pochi canali che attraversano il confine dei mondi — e lo fa senza violare la CSP, perché non è esecuzione di script, solo passaggio di messaggi.
Cosa significa in pratica
L'Output Console e l'iniezione JS funzionano su pagine dove il classico trucco dello script inline fallirebbe — GitHub, dashboard bancarie, intranet aziendali con CSP duro. Non configuri nulla; l'estensione sceglie da sé questa strada.
Limiti — cosa la CSP comunque non permetterà
- Caricare script esterni dal tuo codice. Se il tuo JS iniettato prova ad aggiungere uno
<script src="https://cdn...">, quel nuovo tag resta soggetto alla CSP della pagina. - fetch verso domini bloccati. La direttiva
connect-srclimita ancora dove il codice della pagina può inviare richieste. - Non è un bypass di sicurezza. Funziona perché l'utente ha installato consapevolmente l'estensione e le ha concesso permessi — è un privilegio che hai concesso tu, non un buco.
Aggiornamento v3.2.0 — anche regole, azioni e finestre TEMP
Il meccanismo descritto sopra riguardava l'hook dell'Output Console — come l'estensione ascolta il console.log della pagina. L'esecuzione delle tue regole JS, delle azioni e delle finestre TEMP JS è un percorso separato — e anch'esso un tempo funzionava solo sulle pagine la cui CSP permetteva 'unsafe-eval'. Nella v3.2.0 abbiamo portato la stessa «strategia stratificata» anche su quel secondo percorso: l'ordine dei tentativi è chrome.userScripts.execute → new Function → <script src="blob:…">. Regole, azioni e il pannello JS / JS Console ora funzionano anche su Facebook (tramite il fallback blob) e su siti con CSP completamente rigida (tramite userScripts dopo aver attivato una volta «Allow user scripts»). Approfondimento completo: Le regole JavaScript di JustZix ora funzionano anche su Facebook, X e GitHub.
Vedi anche
- L'Output Console cattura gli errori — cosa vede l'hook
- Output Console — la finestra in cui atterrano i log
- window.JZ helpers — l'API programmatica
Installa JustZix — e inietta codice anche dove la pagina dice «no».
Valuta questo articolo
Nessuna valutazione — sii il primo.