內容腳本中的window
對象通常是XRayWrapper
,這意味着您將獲得原始對象,而不是網站可能會覆蓋的任何對象。這也意味着,該網站將不會看到您對window
對象所做的任何修改。
但是,unsafeWindow.isInstalled = ...
應該工作(儘管.isInstalled
是非常通用的,因此可能與網站已經使用的變量衝突)。
關於XRayWrapper
和unsafeWindow
,參見docs。
解決因@canuckistani提出的非常有效的擔憂:
讀取數據來自或unsafeWindow
執行功能是在這個意義上安全,它不能直接導致代碼執行的另一個(您的內容腳本)車廂。 Spidermonkey的隔間將確保這一點。其他一切都將是Spidermonkey或Gecko中的安全問題。 (請注意,這僅僅是指Spidermonkey,IIRC是實現隔間或膜的唯一引擎,或者其他引擎可能具有其他安全屬性)。
但絕對不能信任來自網站的數據。 unsafeWindow
只是有更多的方法讓你pwnd。 除了拋出代碼之外,拒絕服務於你的是一個意想不到的無限循環或類似的東西,永遠不會明示或暗示地評估你的上下文中的代碼。
E.g.這是一個安全漏洞,不管你使用的窗口或unsafeWindow:
for (var el of window.document.querySelectorAll("*[onclick]")) {
el.addEventListener("click", el.getAttribute("onclick"));
el.removeAttribute("onclick");
}
這您腳本環境中創建的網站控制字符串(.getAttribute
)匿名函數(事件監聽器),沒有上下文的網站。
這將是不安全的爲好,但使用unsafeWindow
只有在這個時候:
for (var el of unsafeWindow.document.querySelectorAll("p")) {
el.addEventListener("click", 'alert("I am ' + el.clientHeight + 'px tall");');
el.removeAttribute("onclick");
}
當使用XRayWrapper
包裹window
,你可以肯定的是document
實際上是文檔,document.querySelectorAll
實際上是一個功能吐痰出一些元素和el.clientHeight
實際上是一個數值。
通過unsafeWindow
所有這些假設可能是不正確的。該網站可能會做這樣的事情:
document.querySelectorAll = function() {
return [{
clientHeight: 'a pwnd content script"); doSomethingEvil(); alert("Now I own you! And I am certainly not 0'
}];
};
雖然仍處於一個特權升級意義下是安全的網站來執行unsafeWindow.document.querySelectorAll
,作爲重寫的功能仍然艙(安全環境)中運行時,返回值根本不可信。
或者腳本可能已經做了其他事情來打破你的東西,不一定帶有惡意的意圖。例如。你的脫殼拒絕服務。
Object.defineProperty(document, "title", {
get: function() { while(true); }
});
// or
Object.defineProperty(document, "title", {
get: function() { throw new Error("get off my lawn!"); }
});
@nmaier你的意思是說其他的問題是這樣的一個重複,因爲這一個被問和超過6個月前回答你的是從昨天開始,對不對? – Marek
不是。我的意思是把這個問題與另一個問題結合起來,這將成爲這些類型問題的規範(「全部」)問題/答案。這並不意味着你的問題在我的觀點中是錯誤的或不好的;事實上,事實恰恰相反,正如上文所說的那樣。我實際上只考慮使用你的(這個)問題,而不是發佈一個新的問題,但它的範圍太有限(只是詢問變量)成爲規範問題。這更像是一項管家工作,在很多標籤中都很常見。 – nmaier
如果作爲副本關閉,我真的不會得到什麼價值。這是第一次谷歌擊中「如何設置JavaScript變量火狐添加上sdk」和許多類似的查詢。您的「規範」答案永遠不會被發現與類似的關鍵字,並不會提供任何價值。 – Marek