使用 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 代码的主要内容,如果未能解决你的问题,请参考以下文章