1

我的应用程序(正在开发中)使用 Safari 4.0.3 和 JavaScript 向用户展示其前端。后端是 PHP 和 SQLite。这是在 OS X 10.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" ...

等等超过2800个字符。效果就好像我上面的 JavaScript 语句没有被执行——我可以看到使用 Safari 的“开发”菜单中的错误控制台来查看 iFrame。如果我从 SQLite 后端数据库中提取 HTML 并将其保存为 .html 文件,那么 Safari 将毫无问题地呈现它。

任何关于为什么会发生这种情况的评论,或者关于 innerHTML 的这种使用,或者指向相同讨论的指针,将不胜感激。

4

1 回答 1

2

innerHTML不等于写一个完整的文档。即使你outerHTML按照 Gumbo 的建议写信,根元素之外的东西也会混淆它,例如 doctypes。要一次编写整个文档,您必须使用老式的跨框架 document.write:

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

每个块都是收到的电子邮件的正文,因此无法控制收到的 HTML 的质量。

好的,那么您可能会遇到安全问题。

如果您让诸如电子邮件之类的不受信任的来源将 HTML 注入您的安全上下文(并且您正在写入的 iframe您的安全上下文中),它可以运行自己的 JavaScript,包括可以访问并控制您的整个在同一主机名上包含应用程序和其他任何内容。除非您的应用程序如此微不足道,否则您根本不在乎,这真是个坏消息。

如果您需要允许不受信任的 HTML,许多网络邮件服务的做法是将其提供在无法访问应用程序任何其他部分的不同主机名(例如子域)上。为此,您的 iframe src 必须指向不同的主机名;您不能在两个安全上下文之间编写脚本。

于 2009-09-24T14:38:07.347 回答