内容安全策略是否阻止书签?

时间:2011-09-30 08:03:31

标签: javascript security firefox mozilla content-security-policy

Mozillas CSP是否会阻止默认执行​​Javascript from a bookmark

可以配置这样做吗?

4 个答案:

答案 0 :(得分:18)

截至2017年,答案仍然是一个明确的“可能” - 就像这个答案最初发布于2011年时一样。specification清楚地说:

  

对资源强制执行的策略不应干扰用户代理功能(如插件,扩展或书签)的操作。

这确实是我在Chrome 61中看到的行为:书签将在https://addons.mozilla.org/上运行,该网站具有严格的内容安全策略,但没有script-src: 'unsafe-inline'。然而在Firefox 56中,bookmarklet将不会在此网站上运行,并且正在报告CSP违规。

Firefox bug report对此问题进行了长时间的讨论,特别是与similar discussion on the W3C spec相关联。到目前为止,您无法真正依赖不受CSP影响的bookmarklet。你总是可以完全禁用CSP,但这对你来说是一个重要的保护层。

答案 1 :(得分:5)

行为在mozillas wiki中指定。

  

CSP不应干扰用户提供的脚本(例如浏览器加载项和bookmarklet)的操作。

看看这里: https://wiki.mozilla.org/Security/CSP/Specification#Non-Normative_Client-Side_Considerations

答案 2 :(得分:3)

是的,CSP会阻止Mozilla Firefox中的bookmarklet。有bug about it

但是,你可以通过将JS代码注入外部CSS样式表来解决这个限制,就像我的Top News Feed bookmarklet那样:

外部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);
})()

bookmarklet加载包含JS代码的CSS文件,添加由此CSS设置的元素,读取元素样式属性和eval代码。

答案 3 :(得分:0)

我创造了一种解决方法"修复"使用Greasemonkey用户脚本(在Firefox中)解决此问题。您现在可以在所有CSP和https://网站上安装bookmarklet,并将您的书签放在一个漂亮,易于编辑的库文件中,而不是单独压缩成书签。

请参阅:https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J