在沙盒iframe中使用常见的JS库

时间:2018-08-19 17:55:15

标签: javascript iframe sandbox postmessage

我计划为我的Web应用程序构建一个模块系统,该系统使用沙盒iframe和postMessage API安全运行自定义用户模块。 iframe会阻止所有DOM访问,并且只能通过我提供的接口进行通信,该接口会检查一些权限并提供数据。

系统本身非常简单,并且可以在模块内部使用普通js代码正常工作,但是我希望允许开发人员使用通用框架/库来简化开发,即使用Vue进行数据绑定。

向模块提供此类功能的最佳方法是什么?性能是一个巨大的因素,因为数十个这样的模块可能会同时运行。让沙盒模块共享库是否安全?

1 个答案:

答案 0 :(得分:5)

很好的建议:不幸的是,iframe沙箱是双向的。通常,(少数例外:主要是postMessagepages that satisfy the same-origin policy),iframe实际上是一个单独的网页,无法从宿主页访问,反之亦然。可能只是要求各个开发人员使用轻量级库的更好的选择。

错误建议::如果您自己托管其他开发人员的文件,他们可以相互访问,但是以这种方式在iframe之间访问文件绝对不是理想的选择-这样真的不是一个好主意,因为它使您容易遭受各种与脚本相关的攻击;更不用说单独的iframe如果在它们之间共享Javascript变量,可能会以意想不到的方式意外地互相干扰。 请不要这样做,除非您明确信任这里的每个开发人员都能正常工作并编写良好的代码(即您在同一工作场所)。实际上,就是根本不要这样做。

但是,如果您确实要执行此操作,则:iframe的目标位于同一网站上,则可以通过全局变量parent(即, parent与主机中的iframe相同,window是父级的jQuery对象,而parent.$parent.document.getElementById相同)。父页面可以使用document.getElementById访问其相同来源的iframe(并且document.getElementById("the id of the iframe").contentWindow等也可以在此处使用),但是如果托管了潜在恶意开发人员的代码,同样

。在您的页面上执行相同的政策,您将授予这些开发人员访问您的页面以及用户在其中键入的任何信息(包括密码)的权限。