#青训营笔记创作活动#
1月25日 Day12

阿里的一次面试经历

一个朋友分享的阿里四面的问题,“请设计一个不能操作DOM和调接口的环境”。

传统的思路实现起来并不好实现,比如直接修改 window.document 的值,让开发者无法获取 document,但这个值其实是不能修改的,而禁用调接口的方法不能禁用第三方库,因为第三方库太多了。

而这个问题用沙箱就可以完美解决,沙箱(Sandbox) 是一种安全机制,为运行中的程序提供隔离环境,通常用于执行未经测试或不受信任的程序或代码,它会为待执行的程序创建一个独立的执行环境,内部程序的执行不会影响到外部程序的运行

iframe 标签可以创造一个独立的浏览器原生级别的运行环境,这个环境由浏览器实现了与主环境的隔离,利用 iframe 来实现一个沙箱是目前最方便、简单、安全的方法,可以把 iframe.contentWindow 作为沙箱执行的全局 window 对象,沙箱中对window的所有操作,都没有影响到外层的window,实现了隔离的效果。

然后主要进行两部分的操作
1.设置 blacklist 黑名单,添加 document、XMLHttpRequest、fetch、WebSocket 来禁止开发者操作DOM和调接口
2.判断要访问的变量,是否在当前环境的 window 对象中,不在的直接报错,实现禁止通过三方库调接口

而对于一些其他的获取DOM操作,比如通过 window.document 来获取 document 对象,依然是可以操作 DOM 的,所以需要在黑名单中添加windows字段来解决,同时虽然把 window 加入了黑名单,但 window 上的方法,如 open、close 等,依然是可以正常获取使用的。
对于通过new Image()调接口的方式,就可以通过在黑名单中添加Image字段来解决。

如果有其他的bug,也可以尝试在黑名单添加对应的字段来禁止调用。
展开
评论