【问题标题】:Content Security Policy: cannot load Mixpanel in Chrome extension内容安全策略:无法在 Chrome 扩展程序中加载 Mixpanel
【发布时间】:2013-04-05 15:13:07
【问题描述】:

过去一天我一直在努力解决这个问题,并且几乎没有在线资源可用于集成 Chrome 扩展程序和 Mixpanel。我希望这个线程是人们在处理将 Mixpanel 集成到 Chrome 扩展时所指的那个线程。

我的 Mixpanel 集成的目标是能够使用我的内容脚本 content.js 以及我的 popup.js 跟踪事件(所以基本上在我的整个扩展程序中)

我有一个 popup.html 文件,它在 </head> 标记之前调用 <script src="mixpanel.js"></script>

在我的mixpanel.js 文件中是:

(function(e,b){if(!b.__SV){var a,f,i,g;window.mixpanel=b;a=e.createElement("script");a.type="text/javascript";a.async=!0;a.src=("https:"===e.location.protocol?"https:":"http:")+'//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';f=e.getElementsByTagName("script")[0];f.parentNode.insertBefore(a,f);b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;"undefined"!==
typeof d?c=b[d]=[]:d="mixpanel";c.people=c.people||[];c.toString=function(b){var a="mixpanel";"mixpanel"!==d&&(a+="."+d);b||(a+=" (stub)");return a};c.people.toString=function(){return c.toString(1)+".people (stub)"};i="disable track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.increment people.append people.track_charge people.clear_charges people.delete_user".split(" ");for(g=0;g<i.length;g++)f(c,i[g]);b._i.push([a,
e,d])};b.__SV=1.2}})(document,window.mixpanel||[]);

mixpanel.init("MY_TOKEN");

当我点击我的扩展按钮并检查它时,控制台输出以下错误:

Refused to load the script 'http://cdn.mxpnl.com/libs/mixpanel-2.2.min.js' because it violates the following Content Security Policy directive: "script-src 'self' https://cdn.mxpnl.com".

这是我的manifest.json 文件的权限部分:

"permissions": ["https://twitter.com/"],
  "content_security_policy": "script-src 'self' https://cdn.mxpnl.com; object-src 'self'"

该扩展程序需要在 Twitter 上运行。

我读过 Google 写的 Content Security Policy doc,但没有帮助

知道我在这里做错了什么吗?任何帮助将不胜感激!

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension google-chrome-devtools mixpanel


    【解决方案1】:

    这里的问题是Chrome不允许扩展加载remote resources over plain HTTP;只允许使用 HTTPS:

    由于中间人攻击是微不足道且无法通过 HTTP 检测到的,因此不会接受那些 [即http:] 来源。

    您的mixpanel.js 脚本尝试加载http://cdn.mxpnl.com/libs/mixpanel-2.2.min.js 而不是相应的https: 链接。要解决此问题,只需更改以下行:

    a.src=("https:"===e.location.protocol?"https:":"http:")+'//cdn.mxpnl.com/libs/mixpanel-2.2.min.js'
    

    到:

    a.src='https://cdn.mxpnl.com/libs/mixpanel-2.2.min.js'
    

    它当前正在加载http: 版本,因为window.location.protocolchrome-extension:,而不是https:。此更改只会强制始终加载 https: 版本。

    【讨论】:

    • @Apsilers,非常感谢。我希望这可以帮助其他遇到它的人。也将转发到 Mixpanel,以便他们在他们的知识库中拥有它。
    • @ZackShapiro 我认为更通用的解决方案是将三进制更改为("https:"===e.location.protocol||"chrome-extension:"===e.location.protocol?"https:":"http:"),以便它自动将https: 用于Chrome 扩展和HTTPS 页面,但在所有其他情况下使用http: .
    • @ZackShapiro,我遇到了和你一样的问题——你有 popup.js、content.js 和清单的完整示例(或代码链接吗?)我试图弄清楚我做错了什么
    【解决方案2】:

    以上答案不完整。你必须再做一件事。

    第 1 步:添加 HTTPS

    按照其他答案告诉您的操作,更改混合面板代码,更改 http://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js

    第 2 步:修改 manifest.json 中的内容安全性

    更新manifest.json 中的content_security_policy 属性: { ..., "content_security_policy": "script-src 'self' https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js; object-src 'self'", ... }

    这放宽了默认的内容安全策略。

    第 3 步 [可选]:添加 Google Analytics

    如果您还需要 Google Analytics,可以这样添加: { ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js; object-src 'self'", ... }

    我在 how to add Google Analytics 上的 Google 自己的教程中学习了如何做到这一点。

    【讨论】:

      【解决方案3】:

      您可以使用此脚本从自定义 url 加载 mixpanel。

      <script>
        window.MIXPANEL_CUSTOM_LIB_URL = 'lib/mixpanel/mixpanel.js';
      </script>
      

      【讨论】:

      • 你如何提供你的令牌?
      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 2021-09-24
      • 2012-09-10
      • 2013-12-23
      • 1970-01-01
      • 2014-06-06
      • 2014-10-26
      • 1970-01-01
      相关资源
      最近更新 更多