javascript - 拒绝执行内联脚本,因为它违反了以下 CSP,Chrome 扩展
问题描述
我们正在尝试在我们的 chrome 扩展中实现谷歌分析。这些是我们所做的步骤:
我们manifest.json
被编辑成这样:
"Content-Security-Policy": "default-src 'self'; script-src 'nonce-4AEemGb0xJptoIGFP3Nd'",
而我们的index.html
:
<head>
<meta charset="utf-8">
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'XXXXX', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js' nonce="4AEemGb0xJptoIGFP3Nd"></script>
<!-- End Google Analytics -->
</head>
我们尝试使用 hash、nonce 和 unsafe inline,但都给出了这个错误代码:
我没主意了。
解决方案
Google 提供了将 GA 添加到 Chrome 扩展的教程:
安装跟踪代码
ga.js
如果当前页面是使用https://
协议加载的,那么标准的 Google Analytics 跟踪代码片段会从受 SSL 保护的 URL 中提取一个文件。Chrome 扩展程序和应用程序只能使用受 SSL 保护的ga.js
.ga.js
Chrome 的默认内容安全策略不允许通过不安全的 HTTP加载。这一点,再加上 Chrome 扩展程序托管在chrome-extension://
架构下这一事实,需要对通常的跟踪片段进行轻微修改,以ga.js
直接从 https://ssl.google-analytics.com/ga.js而不是默认位置提取。以下是异步跟踪 API 的修改片段(修改后的行以粗体显示):
(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = 'https://ssl.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
您还需要通过放宽默认内容安全策略来确保您的扩展程序有权加载资源。manifest.json 中的策略定义可能如下所示:
{ ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", ... }
这是一个弹出页面 (popup.html),它通过外部 JavaScript 文件 (popup.js) 加载异步跟踪代码并跟踪单个页面视图:
<!DOCTYPE html> <html> <head> ... <script src="popup.js"></script> </head> <body> ... </body> </html>
var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-XXXXXXXX-X']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = 'https://ssl.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
推荐阅读
- .net - 在 NET 中使用 Mutex 的单实例
- nativescript - 如何使用 NS 6.0 下载和打开文件
- java - 两个 ZonedDateTime 之间的间隔
- django - 如何确保给定用户名尚未使用用户标签号(如不和谐)
- c# - C# 使用堆栈跟踪引发自定义异常
- python - 我有两个存储的 sting 变量,我需要将其连接到一个不同的变量中以获取 api 获取请求
- node.js - 发布文件上传到 ec2
- javascript - 将变量传递给箭头函数
- c++ - 将遗留 C++ 标准库从 GNU 版本迁移到 LLVM 版本
- reactjs - 刷新后 React-router-dom 链接路由到目标页面