Javascript创建沙箱
用途
在隔离环境中,用以测试不受信任的文件或运行用户输入等行为的工具
实现原理
构建with块级作用域限制局部变量
with语句 能改变变量的作用域链,使得程序在查找变量值时,都是先在with指定的对象中查找,然后再往上查找
使用ES6的Proxy限制变量向上查找
Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。
当with块级作用域内的调用某一变量时,若此变量在sanbox中有定义,返回sandbox中的定义,否则直接返回undefined。这样起到了隔离代码执行环境的作用
结果返回
在sandbox中预设某个变量用于接收执行代码的返回值。这里是我的实现,不太优雅,酌情使用。
实现代码
// 给多个sanbox做一个缓存
sandboxProxies = new WeakMap()runInSandBox (src : string) {src = 'with (sandbox) { ' + src + '}'const code = new Function('sandbox', src)function has (target, key) { return true}function get (target, key) { if (key === Symbol.unscopables) return undefinedreturn target[key]}return (sandbox) => {if (!sandboxProxies.has(sandbox)) {const sandboxProxy = new Proxy(sandbox, { has, get })sandboxProxies.set(sandbox, sandboxProxy)}let sbp : any = sandboxProxies.get(sandbox)code(sbp)return sbp}
}
调用方法
let sandbox = {window: {},Object,JSON,Math,console,document,returnData: {}
}
let code = "returnData = { 'a': 'hello world' }"
let d = runInSandBox(code)(sandbox)
console.log(d.returnData)
Javascript创建沙箱相关推荐
- 使用Javascript创建XML文件
使用Javascript创建XML文件 出处:http://blog.csdn.net/sutao_713/article/details/1908431 在客户端创建XML文件可以 ...
- JavaScript创建或填充任意长度的数组
JavaScript创建或填充任意长度的数组 直接填充法 const arr = [0,0,0]; Array 构造函数 var len = 3; var arr = new Array(len); ...
- Google Map API使用详解(十)——使用JavaScript创建地图详解(上)
在网页MyTest1.html中我们已经使用了JavaScript来创建地图,下面总结一下使用JavaScript创建一个地图的核心步骤: 1. 导入地图API类库. <script src= ...
- arcgis api for javascript创建webscene
arcgis api for javascript创建webscene,核心代码如下: esriConfig.portalUrl = this.config.portal; var scene = n ...
- javascript创建类_如何使用JavaScript创建吹气效果
javascript创建类 Have you ever wondered how you can create a realistic air blowing effect with JavaScri ...
- javascript创建类_如何在10分钟内使用JavaScript创建费用管理器
javascript创建类 by Per Harald Borgen 通过Per Harald Borgen 如何在10分钟内使用JavaScript创建费用管理器 (How to create an ...
- Javascript 创建书签小工具 (bilibili视频下载为例)
书签小工具(Bookmarklets)是一个非常棒的javascript代码小片断伪装成的小应用,它驻留在你的浏览器里并为网页提供额外的功能.这里我们将研究如何从头开始创建一个书签小工具及一些最佳实践 ...
- 使用 Javascript 创建和生成 UUID
通用唯一标识符 (UUID) 在软件开发中无处不在,用于从识别对象元素到网页上的 DOM 元素的所有内容. 它们是唯一的 128 位标识符,由格式的 36 个字符组成 . 例如 UUID 通常不依赖于 ...
- 使用 HTML CSS 和 JavaScript 创建星级评分系统
各位读者好,今天在本博客中,您将学习如何使用 HTML CSS 和 JavaScript 创建星级评分系统 (Widget).早些时候,我还分享了一篇关于Star Rating Widget 的博客, ...
最新文章
- [转]WinXP、Win7脚本自动加域及用户资料迁移
- 7限制cpu使用_Kubernetes 资源配额使用指南 | Linux 中国
- 【链表】逆序打印链表
- jqGrid 常用方法
- System.Web.HttpContext.Current.Session为NULL解决方法
- python判断密码强度_python – 检查密码的强度(如何检查条件)
- VS2013模块对于SAFESEH映像是不安全的解决方法
- 互联网公司端午节礼盒歧视指南
- 二叉搜索树的删除_LeetCode109.有序链表转换二叉搜索树
- IDEA运行java文件环境配置
- 基于DSP的主动降噪开发之三(CCS软件学习)
- 涂鸦赞助的500个开发套件,先到先得
- matlab怎么分析数据,MATLAB应用——数据分析与统计
- 汉堡按钮的制作以及其中的问题
- 你还在用canvas画爱心吗?看我让你的名字在星空绽放
- android 闪光灯 频闪,技术丨频闪人像的闪光灯调节和拍摄要点
- 什么是贴片元器件,有哪些优缺点和种类
- EIGRP理论详解及基础实验
- (十二)Linux设置定时任务及开机自启动
- sklearn_决策树