2011-09-30 66 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