内容安全策略:无法在Chrome扩展中加载Mixpanel

Content Security Policy: cannot load Mixpanel in Chrome extension

本文关键字:扩展 Chrome 加载 Mixpanel 安全策略      更新时间:2023-09-26

我在过去的一天里一直在努力解决这个问题,网上几乎没有可以集成Chrome扩展和Mixpanel的资源。我想这个线程的人指的是当处理集成Mixpanel到Chrome扩展

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

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

在我的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上工作。

我已经读了谷歌写的内容安全政策文档,但没有什么帮助

你知道我哪里做错了吗?任何帮助将非常感激!

这里的问题是Chrome不允许扩展通过普通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:版本。

以上答案不完整。你还得再做一件事。

步骤1:添加HTTPS

按照另一个答案告诉你的去做,改变mixpanel代码,改变 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

如果你也想要谷歌分析,你可以这样添加它: { ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js; object-src 'self'", ... }

我学会了如何做到这一点,从谷歌自己的教程如何添加谷歌分析

你可以使用这个脚本从自定义url加载mixpanel。

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