Javascript 使用innerHTML加载iframe有什么问题吗?

Javascript 使用innerHTML加载iframe有什么问题吗?,javascript,safari,innerhtml,Javascript,Safari,Innerhtml,我的应用程序(正在开发)使用Safari 4.0.3和JavaScript向用户展示其前端。后端是PHP和SQLite。这是在OSX10.5.8下实现的 该应用程序将不时收到HTML块以呈现给用户。每个区块都是接收到的电子邮件的主体,因此无法控制接收到的HTML的质量。我所做的是使用innerHTML将块推入iFrame,并让Safari渲染它 为此,我要这样做: window.frames["mainwindow"].window.frames["Frame1"].document.body.

我的应用程序(正在开发)使用Safari 4.0.3和JavaScript向用户展示其前端。后端是PHP和SQLite。这是在OSX10.5.8下实现的

该应用程序将不时收到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" ...

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必须指向不同的主机名;您无法在这两个安全上下文之间编写脚本。

有趣的是,我已经找到了文档。请在阅读Gumbo的回复之后,在看到您的回复之前,再进行编写。正如我在对他的回复的评论中提到的,我还发现我需要做更多的数据验证,我现在已经添加了。我在AJAX流中使用NUL、SOH和STX作为数据分隔符,其中一个出现在html头中。您关于安全性的评论被采纳了-谢谢。目前,我写这篇文章主要是为了自娱自乐,并在退休后继续做一些技术工作。然而,我可以看到,如果我想让它有更广泛的用途,我可能需要对它进行重组。再次感谢。