扩展和书签的内容安全策略

时间:2014-08-27 15:20:48

标签: security google-chrome-extension bookmarklet browser-extension content-security-policy

Github有以下Content Security Policy

  

Content-Security-Policy:default-src *;脚本-SRC   assets-cdn.github.com www.google-analytics.com   collector-cdn.github.com; object-src assets-cdn.github.com;风格-SRC   '自' '不安全直插' '不安全-EVAL' assets-cdn.github.com; IMG-SRC   '自' data:assets-cdn.github.com identicons.github.com   www.google-analytics.com collector.githubapp.com   * .githubusercontent.com * .gravatar.com * .wp.com; media-src' none&#39 ;; frame-src' self' render.githubusercontent.com www.youtube.com   player.vimeo.com checkout.paypal.com; font-src assets-cdn.github.com;   connect-src' self' ghconduit.com:25035 live.github.com   uploads.github.com s3.amazonaws.com

我们可以使用Evernote或Pocket等服务的浏览器扩展来剪辑/检索网页内容。

我在这个Github政策中没有看到任何对Pocket或Evernote的引用。有人可以解释为什么Pocket扩展能够从Github检索内容,而Evernote扩展不是,CSP error

CSP策略是否可以阻止加载bookmarklet应用程序或浏览器扩展应用程序(如剪辑器)?如果是这样,Pocket如何能够使其扩展能够处理任何内容?

我们的书签/扩展程序中存在这个问题,我希望它们像Pocket扩展程序一样顺畅,但我不知道从哪里开始...谢谢


修改: 由于人们在评论中要求代码,我们的书签加载了这个javascript:

javascript: (function() {
    function loadScript(a, b) {
        var c = document.createElement('script');
        c.type = 'text/javascript';
        c.src = a;
        var d = document.getElementsByTagName('head')[0],
            done = false;
        c.onload = c.onreadystatechange = function() {
            if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
                done = true;
                b()
            }
        };
        d.appendChild(c)
    }
    loadScript('http://localhostsss.com:9000/assets/js/backbone/views/clipping/clippinglocal.js', function() {
        s.clipping.initClipping()
    })
})()

如果我尝试在具有CSP的媒体页面中启动此书签,我会收到以下错误。

  

拒绝加载脚本   ' http://localhostssss.com:9000/assets/js/backbone/views/clipping/clippinglocal.js'   因为它违反了以下内容安全策略指令:   " script-src' unsafe-eval' '不安全直插'关于:   https:// .akamaihd.net http:// .baidu.com https://bitly.com   https:// .cloudfront.net https:// .facebook.com https:// .facebook.net   https://getpocket.com https:// .github.com https:// .googleapis.com   https://ssl.google-analytics.com https://app.greenhouse.io   https:// .medium.com https://myspace.com https:// .pinterest.com   https://www.readability.com https://thinkery.me https://this.cm   https:// .twitter.com https://use.typekit.net https://* .instapaper.com   '自'"

有人可以告诉我如何在像Medium或Github这样有CSP政策的网站上加载我们的书签。

我无法谈论浏览器扩展,因为我还没有对它进行过工作,而且这个人并不在这里。我只知道我们有同样的问题,我们的浏览器扩展基本上与我们的bookmarklet相同的代码,除了它有点适合浏览器扩展shell。如果您只能回答书签案例,我会接受答案,但是对浏览器扩展的任何提示都会很好:)

1 个答案:

答案 0 :(得分:17)

  

CSP策略是否可以阻止加载bookmarklet应用程序或浏览器扩展应用程序(如剪辑器)?

非常简单:如果扩展名或书签小册子违反了CSP,则会被阻止。

因此,如果CSP阻止所有内联脚本,则不会有书签。 Github使用media-src做到了这一点,因为通过简单存在," media-src"默认情况下,指令块内联脚本。因此,没有书签可以在Github上运行。

(作为旁注,尽管所有浏览器都以这种方式工作,但这并不是标准所说的。书签实际上应该免于CSP,但遗憾的是没有浏览器不愿意这样做。 )

现在,关于哪些扩展将起作用或不起作用,这取决于扩展本身的工作方式。 CSP不能直接阻止扩展,但是,如果扩展尝试执行任何违反CSP的操作,则可能会失败。因此,在Github上,如果扩展程序尝试将本机脚本添加到页面的DOM中,或者尝试将外部脚本从未批准的位置附加到页面的DOM,或者执行任何其他受限制的操作在CSP中描述,它可能会失败。

那么,Evernote扩展的哪一部分导致了CSP错误,Pocket如何在不导致错误的情况下完成类似的工作呢?我不知道。这一切都取决于如何编写这些应用程序的具体细节。最有可能的是,查看他们的代码并尝试弄清楚它是非常简单的。据我所知,所有Chrome扩展程序都是用JavaScript编写的,并打包为zip文件 - 只是使用不同的文件扩展名。我相信Firefox插件也是如此。