使用 iframe 呈现用户提供的 html 代码

Posted

技术标签:

【中文标题】使用 iframe 呈现用户提供的 html 代码【英文标题】:Using iframe for rendering user provided html code 【发布时间】:2021-08-20 07:25:52 【问题描述】:

我想在我的网站中嵌入用户提供的 html 代码。该代码将是独立的,并将包含scriptstyle 标记。我计划使用Content Security Policy 标头阻止来自提供的HTML 代码的所有网络调用。代码将只能访问 jquery 等标准库和其他标准资源(在 CSP 中也会指定)。我想限制 iframe 内容和父域之间的任何通信。

我的计划是使用<iframe> 来嵌入内容。用户将给出一个输入,然后在单击一个按钮时,将使用给定的输入 sn-p 呈现一个iframe。它将与页面的其他内容内联呈现。

我担心这会对我的网站安全造成影响。

    我可以制作 iframe null 的来源吗?还是我必须将我的内容托管在单独的域中,以便 SOP 阻止对父页面的所有网络调用? 能否为 iframe 单独设置 CSP?如果是,谁能建议 CSP 应具备的所有属性? 我可以将输入的 html 从父页面直接注入到我的 iframe 中吗?

如果还有其他不使用iframe 的替代方案,是那些?

【问题讨论】:

【参考方案1】:

我可以将 iframe 的来源设为 null 吗?或者我是否必须将我的内容托管在单独的域中,以便 SOP 阻止对父页面的所有网络调用?

如果您将使用例如 data:-Url,则可以将 iframe 的来源设为 null。这将阻止现代浏览器中的跨域请求,但父文档的内容安全策略将被继承到所有浏览器中的 iframe。 在这种情况下,一些旧浏览器 (Firefox/WinXP) 也会将 CSP 从 iframe 传播到父文档。

我能否为 iframe 单独设置 CSP?如果是,任何人都可以建议 CSP 应具有的所有属性吗?

只有通过网络方案 (http:/https:) 加载 iframe,您才能为 iframe 设置单独的 CSP - 它将创建独立的浏览上下文。如果非网络方案(data:、blob: 等)iframe 将继承父文档的 CSP。 在孤立的浏览上下文的情况下,您可以使用任何“属性 CSP”来满足您的特定情况。 注意csp=sandbox= 属性,这些可能很有用。

我可以将输入的 html 从父页面直接注入到我的 iframe 中吗?

这与您的陈述相反:“我想限制 iframe 内容与父域之间的任何通信。”。 因此,所有通信都只能通过服务器进行。

如果还有其他不使用 iframe 的替代方案,是那些?

可以通过<object>/<embed> 创建隔离的浏览上下文,但这些在您的情况下没有用。

【讨论】:

感谢您的回答。与严格的 CSP 策略相比,您能说出使用 sandbox="allow-scripts" 提供多少安全性吗? Can I take the input html and inject it directly to my iframe from the parent page? 我的意思是我想从父级提供 iframe 的 src/srcdoc。例如。 src="<h1>Hello</h1>". CSP 限制 sources 可以从中加载脚本。沙盒限制脚本可能性sandbox="allow-scripts" 不允许 alert()confirm()print()prompt()beforeunload 事件,因为省略了 allow-modals 标志。也将被禁止window.open()target='_ blank'showModalDialog()、表单提交和许多其他,因为没有指定相应的标志。 srcdoc= 导致 iframe 与父页面具有相同的来源 -> 完全访问父页面(非隔离 iframe)。 src= 的隔离级别取决于使用方案。如果是 'data:'/'blob:',父页面的 CSP 也会在 iframe 中起作用。在 'http:'/'https:' 的情况下,iframe 将被完全隔离,并且可以拥有自己的 CSP(通过元标记或 CSP HTTP 标头)

以上是关于使用 iframe 呈现用户提供的 html 代码的主要内容,如果未能解决你的问题,请参考以下文章

HFS在iFrame src中

ASP.NET 的框架 javascript 不允许我呈现原始 HTML IFRAME

仅使用提供的 src 属性定位 iframe

如何在动态呈现中为搜索引擎用户代理提供静态 HTML?

确定 IFrame 已加载后何时呈现 iFrame 内容

IFrame和父帧会话处理