2013-11-15 61 views
0

我有一些代碼正在執行此操作以顯示遠程源HTML代碼段。阻止Firefox插件中的特權升級js代碼iframe

respDiv.children[i].innerHTML = '<iframe type="content" src="about:blank" style="height:300px;width:100%;border:none;"/>'; 
respDiv.children[i].children[0].contentDocument.write('<style> * {font-size:12px;}</style>'+untrustedHTML); 

這個插件被拒絕,因爲遠程代碼注入的,所以我想知道是否有任何安全的方式做這樣的事情?

回答

1

如果您的iframe正在從您的擴展中顯示頁面而不是遠程頁面,那麼可能您應該使用DOM構建方法來添加元素。例如需要用於插入<style>元件將被寫入

respDiv.children[i].innerHTML = '<iframe type="content" src="about:blank" style="height:300px;width:100%;border:none;"/>'; 

更改

var iframe = document.createElement("iframe"); 
iframe.setAttribute("type", "content"); 
iframe.setAttribute("src", "about:blank"); 
iframe.setAttribute("style", "height:300px;width:100%;border:none;"); 
respDiv.children[i].appendChild(iframe); 

類似代碼。

但是,如果框架的src引用了遠程頁面,則由於安全隱患,您可能需要很長時間才能獲得批准。

+0

確實如此,但除非這是一個循環,否則浪費幾納秒就不需要重寫。我知道不要放置遠程網址。 – NoBugs

-1

您的擴展程序被拒絕了,因爲使用您當前的代碼,審閱者無法知道(並且無法保證)untrustedHTML的內容不會有什麼不好。它可能包含跟蹤用戶或竊取其登錄信息的腳本,或者更糟。

解決方法是使用DOM方法插入此內容。這將確保您(和審閱者)知道將要放置在該iframe中的內容的類型。例如,如果你的擴展剛插入文本,你可以這樣做:

respDiv.children[i].innerHTML = '<iframe type="content" src="about:blank" style="height:300px;width:100%;border:none;"/>'; 
respDiv.children[i].children[0].contentDocument.write('<style> * {font-size:12px; }</style>'); 
respDiv.children[i].children[0].contentDocument.appendChild(respDiv.children[i].children[0].contentDocument.createTextNode(textyouwanttoinsert)); 

如果內容包含要比文本元素,那麼你就需要使用DOM方法來創建這些爲好。如果untrustedHTML非常複雜,則可能必須先解析它,然後使用DOM方法插入它;只要確保你有一個你會插入的東西(元素,屬性等等)的有限列表。或者,您的數據源是JSON還是XML或其他內容,並將其轉換爲HTML。關鍵是,不要將數據源中的HTML放入網頁中。

+0

但是,如果我正在創建一個文本節點,爲什麼要使用iframe? – NoBugs

+0

我不知道你爲什麼使用iframe。如果您出於某種原因使用它,這會導致我的建議無法正常工作,請包含此信息,並在必要時修改答案。 –

+0

其實你需要有一個'data:'url,所以它不會繼承chrome窗口的上下文 - 請參閱https://developer.mozilla.org/en-US/docs/Displaying_web_content_in_an_extension_without_security_issues – NoBugs