2009-09-24 60 views
1

我的應用程序(正在開發中)使用Safari 4.0.3和JavaScript將其前端呈現給用戶。後端是PHP和SQLite。這是在OS X 10.5.8下。使用innerHTML加載iframe會出現什麼問題?

該應用程序將不時收到大量的HTML呈現給用戶。每個塊都是收到的電子郵件的主體,因此無法控制接收到的HTML的質量。我所做的是使用innerHTML將塊推入一個iFrame並讓Safari進行渲染。

要做到這一點我做到這一點:

window.frames["mainwindow"].window.frames["Frame1"].document.body.innerHTML = myvar; 

其中MYVAR包含接收到的HTML。現在,大多數情況下,它可以按照需要運行,並且HTML按預期呈現。當大塊的標籤看起來是這樣的例外:

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" ... 

等等超過2800個字符。效果就好像我上面的JavaScript語句沒有被執行 - 我可以看到在Develop菜單中使用Safari的Error Console來查看iFrame。如果我從SQLite後端數據庫中提取HTML並將其保存爲.html文件,那麼Safari將毫不費力地渲染該文件。

任何意見,爲什麼這可能會發生,或者這種使用innerHTML,或指針討論相同,將不勝感激。

回答

2

innerHTML與編寫完整文檔不一樣。即使您按照Gumbo的建議書寫outerHTML,根元素之外的東西也會混淆,比如doctype。要一次寫整個文檔,你必須使用老學校跨框架文件撰寫:

var d= window.frames["mainwindow"].window.frames["Frame1"].document; 
d.open(); 
d.write(htmldoc); 
d.close(); 

每個塊是電子郵件的收身,這樣一個擁有無控制接收到的HTML的質量。

好的,您可能會遇到安全問題。

如果讓像電子郵件注入HTML到您的安全上下文信任的來源(和你寫的iframe是在你的安全上下文),它可以運行自己的JavaScript中,其中包括腳本達到並控制整個封閉的應用程序以及同一主機名上的其他內容。除非你的申請是如此微不足道,你不關心這個,這真是個壞消息。

如果您需要允許不受信任的HTML,許多Webmail服務執行此操作的方式是將其提供給不能訪問應用程序任何其他部分的不同主機名(例如子域)。要做到這一點,你的iframe src將不得不指向不同的主機名;你不能在兩個安全上下文之間編寫腳本。

+0

有趣的是,我在閱讀Gumbo的回覆之後,在看到你之前已經到達document.write。我也在我的評論中提到他的回覆中發現我需要做更多的數據驗證,我現在已經添加了。我在我的AJAX流中使用NUL,SOH和STX作爲數據分隔符,其中一個存在於這個html頭文件中。 您對安全性的評論很好 - 謝謝。目前我主要是爲了自己的喜好寫這篇文章,並且在退休後繼續做一些技術性的工作。不過,我可以看到,如果我想讓它有更廣泛的用途,我可能需要重新構建它。 再次感謝。 – clothears 2009-09-25 09:57:28