Mozillas CSP是否会阻止默认执行Javascript from a bookmark?
可以配置这样做吗?
答案 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