【问题标题】:Any issues with using innerHTML to load up an iframe?使用 innerHTML 加载 iframe 有什么问题吗?
【发布时间】:2009-09-24 12:17:13
【问题描述】:

我的应用程序(正在开发中)使用 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 将毫无问题地呈现它。

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

【问题讨论】:

    标签: javascript safari innerhtml


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 有趣的是,我在阅读 Gumbo 的回复和看到你的回复之前就来到了 document.write。正如我在对他的回复的评论中提到的那样,我发现我需要做更多的数据验证,我现在已经添加了这些验证。我在我的 AJAX 流中使用 NUL、SOH 和 STX 作为数据分隔符,其中一个存在于该 html 标头中。您对安全性的看法很好 - 谢谢。目前我写这篇文章主要是为了我自己的消遣和退休后继续做一些技术工作。但是我可以看到,如果我希望它有更广泛的用途,我可能需要对其进行重组。再次感谢。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2022-07-22
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多