【问题标题】:Does Content Security Policy block bookmarklets?内容安全策略是否阻止书签?
【发布时间】:2011-09-30 08:03:30
【问题描述】:

Mozillas CSP 默认会阻止执行Javascript from a bookmark 吗?

可以这样配置吗?

【问题讨论】:

  • 只是好奇,你为什么要禁用书签?
  • 我不只是担心其他人可能会这样做,因为他们不想在网页上注入 Javascript。
  • 总有油脂猴之类的东西。如果用户决定他想在网站中注入只会影响他自己的javascript,那么没有人可以阻止他这样做。
  • Greasemonkey 也会有同样的问题。他们也许能够重写 http 标头或更改浏览器设置。
  • 我相信通用汽车不会。它是一个浏览器扩展,因此它通常不受安全限制的影响 - 并且脚本不会直接在站点的上下文中执行。

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


【解决方案1】:

截至 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,但这对您来说是一个重要的保护层。

【讨论】:

  • 感谢您的测试!但是,如果您愿意,您可以简单地切换 CSP。打开 about:config 并将“security.csp.enable”设置为“false”。因此,无论如何您都可以运行自己的小册子。
  • @PiTheNumber:我的回答已经说您可以关闭 CSP - 并建议不要这样做。
  • 对不起,我在写评论的时候没有看到你编辑。
【解决方案2】:

该行为在 Mozilla wiki 中指定。

CSP 不应干扰用户提供的脚本(例如浏览器插件和书签)的操作。

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

【讨论】:

    【解决方案3】:

    是的,CSP 会阻止 Mozilla Firefox 中的书签。有一个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);
    })()
    

    书签加载一个包含 JS 代码的 CSS 文件,添加一个由该 CSS 设置样式的元素,读取元素样式属性和 eval 代码。

    【讨论】:

    • Refused to load the stylesheet 'https://<mysite.com>/bookmarklet.css' because it violates the following Content Security Policy directive: "style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github.com".
    【解决方案4】:

    我已经使用 Greasemonkey 用户脚本(在 Firefox 中)为这个问题创建了一个解决方法“修复”。您现在可以在所有 CSP 和 https:// 网站上拥有书签,并且将书签放在一个漂亮、易于编辑的库文件中,而不是单独压缩到书签中。

    见:https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J

    【讨论】:

    • 此方法无效,因为无法执行小书签(bookmarklet = unsafe-inline
    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2021-08-21
    • 2021-09-19
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2020-12-16
    相关资源
    最近更新 更多