2014-01-10 51 views
0

我寫了一個Mozilla Firefox Addon,它讓我評論網站:當我打開一個網站並點擊某處時,插件會在此位置創建一個<div>框,我可以在哪裏輸入評論文字。之後,當我再次打開網站時,該插件會自動將我之前創建的評論框放置在之前的位置。 (類似於許多PDF讀者評論功能等)Firefox Addon操縱DOM而不讓網站獲得更改

這導致了安全問題:一個網站可以使用一個事件偵聽器聽創造新的<div>元素和閱讀其內容,允許它閱讀我的私人評論。

我該如何解決這個安全問題?基本上,我想要一個Firefox插件將專用內容放入網站中,而網站不應該能夠通過JavaScript訪問此內容。 (除非我想要。)

我可以聽取聽衆的意見,並在網站連接時立即將其分開 - 但這聽起來像是一個可靠的解決方案。

是否有一個安全概念,以使我的插件分別對DOM更改的權限控制對某些元素的訪問? 或者,是否有可能實現某種疊加,這不會是網站DOM的實際部分,而只能通過插件訪問?

其他插件會出現類似的安全問題。他們如何解決它?

+0

快速,也許是題外話題:爲什麼一個插件,而不是一個userscript? – Lucio

+1

我想你的名字會自動注入到每個頁面中,因此頁面可以竊取它是真正的安全問題。 – meagar

+0

感謝您的考慮。這個問題不是關於插件的目的,而是在不讓網站知道的情況下更改DOM的一般原則。爲了澄清,我重寫了這個問題。 –

回答

3

如果您在文檔中注入DOM,文檔將始終能夠操作它,但您無法真正做到。您可以:

1)不要直接在文檔中插入您的評論,但只是佔位符是評論的第一個單詞或評論的圖像版本(您可以使用canvas生成評論) ,將全部內容保留在JavaScript附加範圍中,這是無法從該頁面訪問的:當您單擊編輯或添加時,您可以改爲打開panel,然後在那裏進行編輯。

2)注入一個iframe,如果你在另一個域中遠程訪問你的頁面應該不成問題,那麼父級的文檔將無法訪問iframe;而且反之亦然:您需要將內容腳本附加到您的iframe以與您的附加代碼進行對話,然後您可以使用附加代碼從iframe和父母的文檔發送和接收消息。 如果您使用本地resource://文檔,恐怕您需要一個糟糕的解決方法,而您需要使用​​策略來避免父文檔可以與iframe本身進行通信。請參閱我的回覆:Firefox Addon SDK: Loading addon file into iframe

3)使用CSS:您可以通過頁面模塊中的contentStylecontentStyleFile將CSS應用於文檔。以這種方式附加的CSS不能由文檔本身檢查,並且您可以使用content將文本添加到頁面,而不實際添加可以檢查的DOM。所以,你比如風格可能是:

span#comment-12::after{ 
    content: 'Hello World'; 
    } 

當您添加DOM可能是:

<div><span id='comment-12'></span></div> 

如果頁面試圖檢查範圍的內容,它會得到一個空的文本節點;並且因爲從頁面本身以這種方式添加的樣式表不能被檢查,他們不能通過樣式來獲取文本。

不確定是否有替代品,這些都是我腦海中浮現的解決方案。

2

加載項做類似的事情實行白名單/黑名單的功能,附加的用戶要麼指定他們希望該網站的動作,以在發生,或範圍的站點,他們想要的某種組合它發生在。作爲附加作者,您可以創建它並可能提供合理的默認配置。 Adblock Plus做類似的事情。

+0

謝謝,但我認爲對於一些插件白名單不合適。爲了說明這個問題,我重寫了這個問題,在這種情況下,通過實施白名單並不能真正避免安全問題。 –

2

創建一個iframe並將所有事件綁定到新的DOM。通過爲網站提供一個不同的域名,您將防止他們傾聽事件和變化。

+0

謝謝,iframe的來源策略是限制訪問的一個很好的解決方案。但是,我不確定我仍然可以通過主插件腳本訪問它。你能詳細瞭解一點嗎? –

+0

@PatrickGreen恐怕我不太熟悉擴展編程 - [我知道用vanilla Javascript很容易](http://stackoverflow.com/questions/2665980/filling-an-iframe-with-dynamic-內容從JavaScript的);同時[用XUL實現它](http://stackoverflow.com/questions/18506117/create-mozilla-extension-to-display-a-popup-and-iframe-in-it)和[附加SDK] (https://gist.github.com/anantn/4430391)似乎是可能的。我想象的確切實現將取決於您現有的代碼和其他具體問題... – Barney

+0

@PatrickGreen同時您可以通過設置['document.domain']來確保iframe無法訪問(https://developer.mozilla.org/en- US/docs/Web/API/document.domain)屬性轉換爲唯一的字符串。 – Barney