我正在创建一个在document_start上运行内容脚本的隐私扩展。
内容脚本需要为每个不同的源注入一个带有动态值的脚本,例如: google.com,twitter.com等等。
这是我的内容脚本:
console.log("Content Script Running ...");
console.log("Window origin: " + window.location.href);
function inject(filePath) {
var script = document.createElement('script');
script.src = chrome.extension.getURL(filePath);
script.onload = function() {
this.remove();
};
(document.head || document.documentElement).appendChild(script);
}
function injectText(text) {
var script = document.createElement('script');
script.textContent = text;
script.onload = function() {
this.remove();
};
(document.head || document.documentElement).appendChild(script);
}
function getSeed(origin) {
// Get a Storage object
var storage = window.sessionStorage;
// Do we already have a seed in storage for this origin or not?
var seed = storage.getItem(origin);
if (seed === null) {
// Initialise a 32 byte buffer
seed = new Uint8Array(32);
// Fill it with cryptographically random values
window.crypto.getRandomValues(seed);
// Save it to storage
storage.setItem(origin, seed);
}
return seed;
}
var origin = window.location.hostname;
var seed = getSeed(origin);
injectText("var seed = '" + seed + "';");
console.log("[INFO] Injected Seed ...");
inject("js/lib/seedrandom.min.js");
console.log("[INFO] Injected Seed Random ...");
inject("js/random.js");
console.log("[INFO] Injected Random ...");
inject("js/api/document.js");
console.log("[INFO] Injected Document API ...");
inject("js/api/navigator.js");
console.log("[INFO] Injected Navigator API ...");
inject("js/api/canvas.js");
console.log("[INFO] Injected Canvas API ...");
inject("js/api/history.js");
console.log("[INFO] Injected History API ...");
inject("js/api/battery.js");
console.log("[INFO] Injected Battery API ...");
inject("js/api/audio.js");
console.log("[INFO] Injected Audio API ...");
inject("js/api/element.js");
console.log("[INFO] Injected Element API ...");
尝试在具有严格CSP的网站上运行此扩展时,例如github.com,我的带有动态种子值的脚本被阻止,而依赖于该值的其他脚本最终会引用一个未定义的值。任何想法如何解决这个问题。
使用src属性加载的脚本是可以的,因为它们位于.js文件中并从扩展中加载,但是一个具有动态值aka var seed = ...的脚本被阻止,因为它是使用textContent属性。
我需要同步运行此代码,然后在页面上的任何其他脚本运行之前,为什么我要在document_start上运行内容脚本。
有什么想法吗?
答案 0 :(得分:0)
我解决了这个问题。我遇到的主要问题是尝试注入具有以下内容的内联文本脚本:
var seed = $(value that changes depending on the page)
这受到某些网站的阻止,例如twitter.com和github.com,这些网站都有限制性内容安全政策。
我的解决方案是在我的内容脚本中执行以下操作:
var filePath = // Get filepath to script
var seed = // Get seed value in content script
var script = document.createElement('script');
script.setAttribute("data-seed", seed);
script.src = chrome.extension.getURL(filePath);
script.onload = function() {
this.remove();
};
(document.head || document.documentElement).appendChild(script);
这将在页面中创建一个脚本,如此
<script data-seed="$(DATA-SEED-VALUE)" src="$(SRC-VALUE)"></script>
然后从这个脚本中,它现在作为页面脚本运行(在网页的内容中):
var seed = document.currentScript.getAttribute("data-seed");
哪个获得了种子。此解决方案更简洁,更容易,并且不需要更改CSP,这可能会为您正在与之交互的站点带来安全问题。