我计划为我的Web应用程序构建一个模块系统,该系统使用沙盒iframe和postMessage API安全运行自定义用户模块。 iframe会阻止所有DOM访问,并且只能通过我提供的接口进行通信,该接口会检查一些权限并提供数据。
系统本身非常简单,并且可以在模块内部使用普通js代码正常工作,但是我希望允许开发人员使用通用框架/库来简化开发,即使用Vue进行数据绑定。
向模块提供此类功能的最佳方法是什么?性能是一个巨大的因素,因为数十个这样的模块可能会同时运行。让沙盒模块共享库是否安全?
答案 0 :(得分:5)
很好的建议:不幸的是,iframe
沙箱是双向的。通常,(少数例外:主要是postMessage
和pages 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
等也可以在此处使用),但是如果托管了潜在恶意开发人员的代码,同样