0

我有一些代码正在这样做以显示来自远程源的 HTML 片段。

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);

由于远程代码注入,插件被拒绝,所以我想知道是否有任何安全的方法来做这样的事情?

4

2 回答 2

1

如果您的 iframe 显示的是扩展中的页面而不是远程页面,那么您可能应该使用 DOM 构造方法来添加元素。例如

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);

需要为插入<style>元素编写类似的代码。

但是,如果框架的 src 引用远程页面,由于安全隐患,您可能很难获得批准。

于 2013-11-15T16:28:01.153 回答
-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 并将其放在网页中。

于 2013-11-15T21:50:21.573 回答