2013-03-05 42 views
13

我正在使用Greasemonkey並嘗試在特定域中添加規則。但它導致錯誤說The operation is insecure
該代碼在Chrome上正常工作。嘗試將規則添加到CSS樣式表給出Firefox中的「操作不安全」

劇本上http://mydomain.com/test/test.php
運行和CSS文件是http://cdn.mydomain.com/test/css/global.css

我的功能:

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) {} 
     } 
    } 
} 

在谷歌,我發現,這可能是因爲我試圖訪問的交叉領域,所以我嘗試將CS​​S文件的網址添加到「接受的網址」,但沒有結果。

我該如何解決這個問題?

+0

時尚的Chrome擴展確實在添加樣式到特定域的一個偉大的工作:https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl = en – 2013-03-05 16:51:39

+0

它適用於Chrome,它不適用於Firefox。 – MetaDebugger 2013-03-05 18:01:50

+0

[適用於Firefox的時尚](https://addons.mozilla.org/en-US/firefox/addon/stylish/)的效果甚至超過Chrome版本。 (例如,Chrome與iframe有問題。) – 2013-03-05 20:44:44

回答

4

是的,Firefox禁止訪問跨域樣式表。它可以(或至少使用)拋出異常:

「訪問受限制的URI被拒絕」 代碼: 「1012」
nsresult: 「0x805303f4 (NS_ERROR_DOM_BAD_URI)」
位置:...。 ..


但是,用CSS,你不需要規則添加到一個特定的樣式表。只是覆蓋你關心的風格。

例如,如果頁面設置:

body { 
    background: white; 
} 

而且你的腳本設置:

body { 
    background: red; 
}  

後,頁面會是紅色的(標稱)。

爲了最簡單,最聰明的方式來改變目標頁面樣式,看到以前的答案,如this one

2

樣式表中的規則以各種方式以該樣式表的權限運行。這意味着如果您可以將規則注入到跨站點樣式表中,則可以執行一些跨站點攻擊。這就是Firefox阻止向跨網站樣式表添加規則的原因。

Chrome有可能會使用鏈接文檔的權限運行所有規則,這就是爲什麼它允許您將東西添加到表單中....但請注意,Chrome不會讓你讀取一個十字 - 現場樣式表。

請注意,如果您使用CORS加載樣式表(通過在<link>上設置「crossorigin」屬性並確保您的CDN提供正確的標題),那麼您將能夠獲得跨網站訪問權。

+0

這是一個Greasemonkey應用程序,OP不控制目標頁面,也無權訪問CDN。 – 2013-03-05 20:42:50

+0

嗯。 greasemonkey是否不以擴展權限運行其腳本? – 2013-03-06 00:49:18

+0

是Greasemonkey *可以*以稍微增強的特權運行(取決於'@ grant'狀態),但它不會影響服務器端的任何內容。它也不會繞過CORS或COWS,只是'GM_xmlhttpRequest()'可以發出跨域請求。 – 2013-03-06 00:59:02

4

我發現這個解決方案有效解決這個問題:

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

這不適用於此問題。 – 2015-06-29 00:57:41