2011-09-30 87 views
17

默認情況下,Mozillas CSP塊是否執行Javascript from a bookmark內容安全策略是否阻止書籤?

它可以這樣配置嗎?

+0

只是好奇心,爲什麼要禁用bookmarklets? – ThiefMaster

+0

我不只是擔心其他人可能會這樣做,因爲他們不希望在網頁上注入Javascript。 – PiTheNumber

+2

總有像greasemonkey的東西。如果**用戶**決定他想在只會影響自己的網站上注入javascript,那麼阻止他這樣做是沒有什麼權利的。 – ThiefMaster

回答

16

截至2017年,答案仍然是明確的:「也許」 - 就在這個答案最初發佈於2011年像的specification明確表示:

政策執行上的資源不應該與干擾用戶代理功能(如插件,擴展或書籤)的操作。

而且這確實是我在Chrome 61看到的行爲:一個書籤將在https://addons.mozilla.org/運行,有沒有script-src: 'unsafe-inline'嚴格的內容安全策略的站點。然而,在Firefox 56書籤將不會運行在這個網站上,並且正在報告CSP違規。

Firefox bug report中對此問題有很長的討論,特別是鏈接到similar discussion on the W3C spec。因此,截至目前,您不能真正依賴書籤小程序不受CSP影響。你總是可以禁用CSP,但這對你來說是一個重要的保護層。

+0

感謝您對此進行測試!但是如果你願意,你可以簡單地切換CSP。打開about:config並將「security.csp.enable」設置爲「false」。所以你無論如何都可以運行你自己的小冊子。 – PiTheNumber

+3

@PiTheNumber:我的答案已經表明你可以關閉CSP,並建議不要這樣做。 –

+0

對不起,我在撰寫評論時看不到您的編輯。 – PiTheNumber

5

是,在Mozilla Firefox的CSP塊的bookmarklet。有一個bug about it

但是,您可以通過注入JS代碼到外部CSS樣式表,就像我Top News Feed bookmarklet繞開這個限制作用:

外部CSS:

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

小書籤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); 
})() 

bookmarklet加載一個包含JS代碼的CSS文件,添加一個由此CSS設計的元素,讀取元素樣式屬性和eval的代碼。

+5

'拒絕加載樣式表'https:// /bookmarklet.css',因爲它違反了以下內容安全策略指令:「style-src'self''unsafe-inline''unsafe-eval'assets-cdn.github .com「.' – Michael

0

我已經使用Greasemonkey userscript(在Firefox中)爲此問題創建瞭解決方法「修復」。現在,您可以在所有CSP和https://網站上擁有小書籤,並且可以將書籤放在一個漂亮,易於編輯的庫文件中,而不是單獨擠壓成書籤。

請參閱:https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J

+0

此方法不起作用,因爲書籤不能執行(bookmarklet ='unsafe-inline') – mems