2013-03-05 7 views
13

Sto utilizzando Greasemonkey e sto provando ad aggiungere una regola in un dominio specifico. Ma si traduce in un errore dicendo The operation is insecure.
Il codice funziona perfettamente su Chrome.Tentativo di aggiungere una regola a un foglio di stile CSS indica "L'operazione non è sicura" in Firefox

Lo script viene eseguito su http://mydomain.com/test/test.php
e il file CSS è http://cdn.mydomain.com/test/css/global.css

La mia funzione:

function css(selector, property, value) { 
    for (var i=0; i<document.styleSheets.length;i++) 
    { 
     try 
     { 
      document.styleSheets[i].insertRule(selector+ ' {'+property+':'+value+'}', document.styleSheets[i].cssRules.length); 
     } 
     catch(err) 
     { 
      try // IE 
      { 
       document.styleSheets[i].addRule(selector, property+':'+value); 
      } 
      catch(err) {} 
     } 
    } 
} 

Su Google ho trovato che potrebbe essere perché sto cercando di accedere trasversali domini, così ho provato ad aggiungere l'URL al file CSS agli "URL accettati" ma nessun risultato.

Come posso risolvere questo problema?

+0

l'estensione Chrome elegante fa un grande lavoro ad aggiungere stili a determinati domini: https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl = it –

+0

Funziona per Chrome, non per Firefox. – MetaDebugger

+0

[Elegante per Firefox] (https://addons.mozilla.org/en-US/firefox/addon/stylish/) funziona anche meglio della versione di Chrome. (Chrome ha problemi con iframe, per esempio.) –

risposta

4

Sì, Firefox blocca l'accesso ai fogli di stile che sono di dominio incrociato. Si può (o almeno usato per) generare l'eccezione:

"L'accesso a URI limitato negato" Codice: "1012"
nsresult: "0x805303f4 (NS_ERROR_DOM_BAD_URI)"
posizione: .... ..


Ma, con i CSS, non è necessario aggiungere le regole per un foglio di stile specifico. Basta sovrascrivere lo stile che ti interessa.

Ad esempio, se la pagina imposta:

body { 
    background: white; 
} 

E il tuo script imposta:

body { 
    background: red; 
}  

Poi la pagina sarà rosso (nominalmente).

Per il modo più semplice e intelligente di modificare gli stili di pagina di destinazione, vedere le risposte precedenti come this one.

2

Le regole di un foglio di stile vengono eseguite con i permessi di quel foglio di stile in vari modi. Ciò significa che se è possibile iniettare regole in un foglio di stile tra siti diversi, è possibile eseguire alcuni attacchi incrociati. Ecco perché Firefox blocca l'aggiunta di una regola a un foglio di stile tra siti diversi.

È possibile che Chrome esegua tutte le regole con i permessi del documento di collegamento, ed è per questo che ti permette di aggiungere cose al foglio .... Tuttavia tieni presente che Chrome non ti consente di leggere una croce di foglio di stile.

Si noti che se si carica il foglio di stile con CORS (impostando l'attributo "crossorigin" su <link> e assicurandosi che il CDN stia servendo le intestazioni corrette), sarà possibile ottenere l'accesso da più siti.

+0

Questa è un'applicazione Greasemonkey, l'OP non controlla la pagina di destinazione, né ha accesso alla CDN. –

+0

Hmm. Greasemonkey non esegue i suoi script con privilegi estesi? –

+0

Sì Greasemonkey * può * eseguire con privilegi leggermente migliorati (a seconda dello stato '@ grant'), ma non può influenzare nulla sul lato server. Né ignora mai CORS o COWS, tranne per il fatto che 'GM_xmlhttpRequest()' può effettuare richieste tra domini. –

4

ho trovato questa soluzione funziona in tutto il problema:

var style = document.createElement("style"); 
document.head.appendChild(style); 
style.sheet.insertRule("body { font-size:40px; }", 0); 
+0

Ciò non risolve il problema. –

Problemi correlati