2011-09-30 11 views
17

Il blocco Mozillas CSP per eseguire Javascript from a bookmark per impostazione predefinita?La politica di Content Security blocca i bookmarklet?

Può essere configurato per farlo?

+0

solo curiosità, perché si vuole disabilitare bookmarklets? – ThiefMaster

+0

Non mi preoccupo solo che qualcun altro possa farlo perché non vogliono che Javascript venga iniettato nella pagina web. – PiTheNumber

+2

Ci sono sempre cose come greasemonkey. Se l'utente ** decide che vuole iniettare javascript nel sito Web che si limiterà a influenzare se stesso, nessuno ha il diritto di impedirgli di farlo. – ThiefMaster

risposta

16

A partire dal 2017, la risposta è ancora un definitivo "forse" - proprio come quando questa risposta è stato originariamente pubblicato nel 2011. Il specification dice chiaramente:

politica forzata su una risorsa non dovrebbe interferire con il operazione di funzioni utente-agente come add-on, estensioni o bookmarklets.

E questo è davvero il comportamento che vedo in Chrome 61: un bookmarklet verrà eseguito su https://addons.mozilla.org/, un sito che ha una politica rigorosa sicurezza dei contenuti, senza script-src: 'unsafe-inline'. Tuttavia in Firefox 56 i bookmarklet non verranno eseguiti su questo sito Web e viene segnalata una violazione CSP.

C'è una discussione molto lunga su questo problema nel Firefox bug report, in particolare il collegamento a un similar discussion on the W3C spec. Quindi, al momento, non puoi davvero fare affidamento sul fatto che i bookmarklet non siano influenzati da CSP. Puoi sempre disabilitare CSP completamente, ma questo è uno strato di protezione importante meno per te.

+0

Grazie per aver testato questo! MA puoi semplicemente cambiare CSP se vuoi. Apri about: config e imposta "security.csp.enable" su "false". Quindi sarai in grado di gestire i tuoi opuscoli comunque. – PiTheNumber

+3

@PiTheNumber: la mia risposta dice già che è possibile disattivare CSP e consiglia di non farlo. –

+0

Spiacente, non ti ho visto modificare quando stavo scrivendo il commento. – PiTheNumber

5

Sì, i CSP blocchi bookmarklet in Mozilla Firefox. C'è un bug about it.

Tuttavia, è possibile aggirare questa limitazione iniettando il codice JS in un foglio di stile CSS esterno, come il mio Top News Feed bookmarklet fa:

esterno CSS:

#topnewsfeed { font-family: '(function(){/*payload*/})()'; } 

Bookmarklet JS:

(function() { 
    var a = document.createElement("link"); 
    a.rel = "stylesheet"; 
    a.href = "//niutech.github.io/topnewsfeed/topnewsfeed.css"; 
    a.onload = function() { 
     var a = b.currentStyle ? b.currentStyle.fontFamily : document.defaultView.getComputedStyle(b, null).fontFamily; 
     eval(a.replace(/^["']|\\|["']$/g, "")); 
    }; 
    document.body.appendChild(a); 
    var b = document.createElement("div"); 
    b.id = "topnewsfeed"; 
    document.body.appendChild(b); 
})() 

Il bookmarklet carica un file CSS contenente codice JS, aggiunge un elemento con questo CSS, legge l'attributo stile elemento e eval il codice.

+5

'Rifiutato di caricare il foglio di stile 'https: // /bookmarklet.css' perché viola la seguente direttiva Content Security Policy:" style-src 'self' 'unssafe-inline' 'unsafe-eval' assets-cdn.github .com ".' – Michael

0

Ho creato una soluzione "completa" per risolvere questo problema utilizzando un userscript Greasemonkey (in Firefox). Ora puoi avere bookmarklets su tutti i siti CSP e https: //, oltre ad avere i bookmarklets in un file di libreria piacevole e facilmente modificabile invece di essere singolarmente schiacciati in un segnalibro.

See: https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J

+0

Questo metodo non funziona perché il bookmarklet non può essere eseguito (bookmarklet =' unsafe-inline') – mems

Problemi correlati