2013-11-14 47 views
4

我想設置一個JavaScript變量來標識Firefox擴展安裝。這個想法是讀取頁面上的這個變量。如何在Firefox中設置javascript變量使用Add On SDK創建Add On?

在使用XUL附加組件(Set an object in a page's window object from a Firefox extension?)和查找有關適用於該任務的Firefox Add On SDK中的contentScript時,無法使用複雜方法實現此操作後,我仍然無法訪問在JavaScript中設置的JavaScript變量contentScript在頁面上。

我在我main.js以下(使用此處提供https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/page-mod.html樣品):

var pageMod = require("sdk/page-mod"); 

pageMod.PageMod({ 
    include: "*", 
    contentScript: 'window.isInstalled=true;window.alert("Page matches ruleset");', 
    contentScriptWhen: "ready" 
}); 

然而,當我試圖讓在JavaScript中window.isInstalled變量在頁面上,這是不確定的,儘管顯示了警報。

如何確保內容腳本所寫的值在頁面上可用?

+0

@nmaier你的意思是說其他的問題是這樣的一個重複,因爲這一個被問和超過6個月前回答你的是從昨天開始,對不對? – Marek

+0

不是。我的意思是把這個問題與另一個問題結合起來,這將成爲這些類型問題的規範(「全部」)問題/答案。這並不意味着你的問題在我的觀點中是錯誤的或不好的;事實上,事實恰恰相反,正如上文所說的那樣。我實際上只考慮使用你的(這個)問題,而不是發佈一個新的問題,但它的範圍太有限(只是詢問變量)成爲規範問題。這更像是一項管家工作,在很多標籤中都很常見。 – nmaier

+0

如果作爲副本關閉,我真的不會得到什麼價值。這是第一次谷歌擊中「如何設置JavaScript變量火狐添加上sdk」和許多類似的查詢。您的「規範」答案永遠不會被發現與類似的關鍵字,並不會提供任何價值。 – Marek

回答

6

內容腳本中的window對象通常是XRayWrapper,這意味着您將獲得原始對象,而不是網站可能會覆蓋的任何對象。這也意味着,該網站將不會看到您對window對象所做的任何修改。

但是,unsafeWindow.isInstalled = ...應該工作(儘管.isInstalled是非常通用的,因此可能與網站已經使用的變量衝突)。

關於XRayWrapperunsafeWindow,參見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!"); } 
}); 
+0

非常感謝你!我花了很多時間試圖完成這項工作,並且Addon SDK使這非常簡單,只要知道使用什麼。事實上,isInstalled只是第一次迭代,我肯定會爲變量使用一個非常具體的名稱。謝謝! – Marek

+1

這裏*有一個安全問題,主要是你應該只設置* window.isInstalled,你永遠不要相信任何來自unsafeWindow的數據。但對於你的用例來說,這很好。 – canuckistani

+1

@canuckistani我在回答中添加了一些關於安全性的內容。 – nmaier

相關問題