【问题标题】:Javascript bookmarklet on site with CSP in Firefox在 Firefox 中使用 CSP 的 Javascript 小书签
【发布时间】:2013-11-18 07:37:39
【问题描述】:

我有一个简单的 Javascript 小书签,我将它放在一起用于针对外部工具运行适当 GitHub 存储库的内容:

javascript:(function(){ 
    var isApex = false;
    var sourceLangs = document.getElementsByClassName('lang');
        for (var i = 0; i < sourceLangs.length; ++i) {
        var l = sourceLangs[i]; 
        if(l.innerHTML == 'Apex') {
            isApex = true;
            // alert('This is an Apex repo');
        }
    }
    if(location.hostname != 'github.com' || isApex == false) {
        alert('This is not a GitHub Apex repository!');
    }
    else {
         window.open('https://githubsfdeploy.herokuapp.com/app/githubdeploy'+location.pathname);
    }

})();

当我在 Chrome 或 IE 中运行它时(通过 Daring Fireball 的 JS 书签生成器运行后,它运行良好。在 Firefox 中,它会生成内容安全策略错误:

[15:33:19.318] Content Security Policy: Directive inline script base restriction violated @ https://github.com/Groundwire/Campaign-Combiner

我读过 this SE question on the topicgithub blog post about CSP,它们承认 CSP 不应该干扰书签,但当时(2013 年 4 月),“没有一个浏览器能做到这一点。”目前是 Firefox 仍然会出错,但 Chrome 和 IE 会出错吗?

我还发现了一篇关于用户脚本和 CSP 的博客文章,作者能够通过包含来自 github 存储库的代码来解决这个问题。我试过了,将我的书签修改为:

javascript:document.body.appendChild(document.createElement("script")).src="https://raw.github.com/tet3/GitHubInstallerBookmarklet/master/GHIBkmarklet.js";void(0)

但不出所料,这不适用于书签,因为调用代码仍然来自浏览器。

简而言之 - 关于如何让这个小书签在 Firefox 上工作的任何想法?

【问题讨论】:

标签: javascript firefox bookmarklet content-security-policy


【解决方案1】:

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

见:http://www.donnelly-house.net/programming/js/bookmarklets/bookmarklets.php

【讨论】:

    【解决方案2】:

    作为 CSP 阻止小书签的一种解决方法,您可以告诉小书签加载外部 CSS 样式表,并将您的 JS 代码注入其中。这就是我的Top News Feed 小书签的作用。 See my other answer.

    【讨论】:

    • 那些也阻止外部 CSS 的 CSP 呢?对于想要阻止所有外部脚本的网站来说,这似乎是一个明智的政策。
    【解决方案3】:

    我也研究过这个问题,主要是在 Firefox 中。我不知道它会在 Chrome 中工作。这可能是最近的变化。没有 FF 更改以将小书签识别为超出策略(应该如此!),没有解决方法。脚本不会运行,句号,你死在水里。

    替代方案:

    1.) 创建一个插件;或利用像 Greasemonkey 这样的现有插件来运行用户脚本。

    2.) 在 Web 控制台中运行代码。在 FF 中,CTRL+Shift+K 可以让你快速到达那里。

    3.) FF 的开发者便笺本也可以使用。如果您将代码保存在文件中,您可以使用 Shift+F4(打开暂存器)> 文件 > 打开最近 > 选择您的文件 > CTRL+R(运行)来相对快速地访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      相关资源
      最近更新 更多