iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >怎么实现JavaScript沙箱的基础功能
  • 914
分享到

怎么实现JavaScript沙箱的基础功能

2023-06-25 11:06:12 914人浏览 薄情痞子
摘要

这篇文章主要介绍“怎么实现javascript沙箱的基础功能”,在日常操作中,相信很多人在怎么实现JavaScript沙箱的基础功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JavaScript沙

这篇文章主要介绍“怎么实现javascript沙箱的基础功能”,在日常操作中,相信很多人在怎么实现JavaScript沙箱的基础功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JavaScript沙箱的基础功能”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、场景

最近基于 WEB 在做一些类似于插件系统一样的东西,所以折腾了一下 js 沙箱,以执行第三方应用的代码。

2、沙箱基础功能

在实现之前(好吧,其实是在调研了一些方案之后),确定了沙箱基于 event bus 形式的通信实现上层的功能,基础的接口如下

export interface IEventEmitter {    on(channel: string, handle: (data: any) => void): void;    offByChannel(channel: string): void;    emit(channel: string, data: any): void;}export interface IJavaScriptShadowbox extends IEventEmitter {    eval(code: string): void;    destroy(): void;}

除了通信的能力之外,还额外要求了两个方法:

  • eval: 执行一段 js 代码

  • destroy: 销毁沙箱,供内部实现处理一些清理任务

JavaScript 沙箱示意图:

怎么实现JavaScript沙箱的基础功能

下面吾辈将分别演示使用 iframe/web worker/quickjs 执行任意 js 的方法

3、iframe 实现

老实说,谈到 web 中的沙箱,可能第一时间想到的就是 iframe 了,但它是以 html 作为入口文件,而非 js,这对于希望将 js 作为入口而不一定需要显示 iframe 的场景而言就不甚友好了。

怎么实现JavaScript沙箱的基础功能

当然可以将 js 代码包裹到 html 中然后执行

function evalByIframe(code: string) {  const html = `<!DOCTYPE html><body><script>$[code]</script></body></html>`;  const iframe = document.createElement("iframe");  iframe.width = "0";  iframe.height = "0";  iframe.style.display = "none";  document.body.appendChild(iframe);  const blob = new Blob([html], { type: "text/html" });  iframe.src = URL.createObjectURL(blob);  return iframe;}evalByIframe(`document.body.innerHTML = 'hello world'console.log('location.href: ', location.href)console.log('localStorage: ',localStorage)`);

iframe 有以下几个问题:

  • 几乎与 eval 没有什么区别(主要是使用 Object.createObjectURL 导致同源了)– 致命的

  • 可以访问所有浏览器的 api 我们更希望它仅能访问注入的 api,而不允许访问所有 dom api

4、web worker 实现

基本上,web worker 是一个受限的 js 运行时,以 js 为入口,和 iframe 差不多的通信机制

function evalByWebWorker(code: string) {  const blob = new Blob([code], { type: "application/javascript" });  const url = URL.createObjectURL(blob);  return new Worker(url);}evalByWebWorker(`console.log('location.href: ', location.href)// console.log('localStorage: ', localStorage)`);

但同时,它确实比 iframe 要更好一点

  • 仅支持有限的浏览器 api,包括 localStorage/document 在内的 api 均无法访问,具体参考:[MDN] Web Workers 可以使用的函数和类

  • 所有注入的 api 均为异步操作,毕竟基于 postMessage/onmessage

5、quickjs 实现

使用 quickjs 的主要灵感来源于figma 构建插件系统的一篇博客,quickjs 中文文档

quickjs 是什么?它是一个 JavaScript 的运行时,虽然我们最常用的运行时是浏览器和 nodejs,但也有许多其他的运行时,可以在 GoogleChromeLabs/jsvu 找到更多。而 quickjs 是其中一个轻量级、嵌入式、并且支持编译为 wasm 运行在浏览器上的一个运行时,同时它对 js 的特性支持到 es2020(包括最喜爱的 Promise async/await)。

async function evalByQuickJS(code: string) {  const quickJS = await getQuickJS();  const vm = quickJS.createVm();  const res = vm.dump(vm.unwrapResult(vm.evalCode(code)));  vm.dispose();  return res;} console.log(await evalByQuickJS(`1+1`));

优点:

  • 事实上,在安全性方面它是无可匹敌的,因为运行在不同的 vm 上,很难出现现有微前端基于 Proxy 可能出现的安全问题。

  • 虽然没有实际测试,但 figma 的那篇博客中指出浏览器的结构化克隆在处理大型对象时存在性能问题,而 quickjs 不存在这种问题。

缺点:

  • 没有全局 api,包括常见的 console/setTimeout/setInterval 都不是 js 的特性,而是浏览器、nodejs 运行时实现的,所以必须手动实现并注入,这是一个显著的缺点。

  • 无法使用浏览器的 DevTool 调试

  • 由于底层使用 c 实现,所以需要手动管理内存的释放

到此,关于“怎么实现JavaScript沙箱的基础功能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么实现JavaScript沙箱的基础功能

本文链接: https://www.lsjlt.com/news/304314.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么实现JavaScript沙箱的基础功能
    这篇文章主要介绍“怎么实现JavaScript沙箱的基础功能”,在日常操作中,相信很多人在怎么实现JavaScript沙箱的基础功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JavaScript沙...
    99+
    2023-06-25
  • MySQL基础 创建学生表实现查询基础功能
    一. 创建学生表 进入MySQL WIN + R 输入cmd 输入mysql -u root -p 输入密码进入mysql 输入show databases;  查询现有数据库 选择一个数据库 use 数据库名称  创建一个学生表 ...
    99+
    2023-10-21
    mysql 数据库
  • 详解C语言实现推箱子的基本功能
    目录1.前言2.游戏效果展示3.项目分析4.地图实现4.1存储地图4.2打印地图5.控制角色移动5.1找到控制的角色5.2实现移动6.判断胜利总结1.前言 首先推箱子是c语言的一个经...
    99+
    2024-04-02
  • JavaScript怎么实现基础排序算法
    本文小编为大家详细介绍“JavaScript怎么实现基础排序算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript怎么实现基础排序算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。正文1、冒泡排...
    99+
    2023-07-02
  • 详解C语言实现推箱子的基本功能(2)
    目录1.前言2.地图代码修改成函数3.角色移动修改成函数3.1寻找角色函数3.2角色移动函数4.判断胜利修改成函数5.主体函数的实现6.推箱子能实现基本功能的源码总结1.前言 本文章...
    99+
    2024-04-02
  • 【Android】使用 CameraX 实现基础拍照功能
    目录 1. 基础开发环境 2. 添加相关依赖 3. APP 布局 4. 主流程逻辑 5. 调试或安装 APK 6. 项目完整代码 1. 基础开发环境 JDK:JDK17 Android Studio:Android Studio ...
    99+
    2023-10-10
    android
  • ThinkPHP框架怎么实现邮箱激活功能
    这篇文章将为大家详细讲解有关ThinkPHP框架怎么实现邮箱激活功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:配置框架采用ThinkPHP3.1框架,如下所示:1.修改配置如下:<ph...
    99+
    2023-06-15
  • 怎么实现javascript暂停功能
    这篇文章主要讲解了“怎么实现javascript暂停功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现javascript暂停功能”吧! ...
    99+
    2024-04-02
  • javascript 怎么实现下载功能
    本教程操作环境:Windows10系统、javascript1.8.5版本、Dell G3电脑。javascript 怎么实现下载功能?js实现文件下载功能一、a标签下载<body> <button onClick=&qu...
    99+
    2023-05-14
    下载 javascript
  • JavaScript怎么实现继承功能
    这篇文章主要介绍“JavaScript怎么实现继承功能”,在日常操作中,相信很多人在JavaScript怎么实现继承功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java...
    99+
    2024-04-02
  • JavaScript怎么实现重置功能
    这篇文章主要介绍“JavaScript怎么实现重置功能”,在日常操作中,相信很多人在JavaScript怎么实现重置功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java...
    99+
    2024-04-02
  • JavaScript怎么实现检索功能
    今天小编给大家分享一下JavaScript怎么实现检索功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前置知识在介绍J...
    99+
    2023-07-06
  • AJAX和WebService怎么实现邮箱验证功能
    这篇文章主要讲解了“AJAX和WebService怎么实现邮箱验证功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“AJAX和WebService怎么实现邮...
    99+
    2024-04-02
  • Vue实现简单基础的图片裁剪功能
    目录一、准备工作二、基本结构三、添加功能onMouseDownonMouseMoveonMouseUponMouseLeave四、总结近日,在写公司项目的时候接到一个需求:对已加载的...
    99+
    2024-04-02
  • 基于JavaScript实现图片裁剪功能
    目录一、图片文件的上传和读取二、图片展示和蒙层处理CSS clip-path三、裁剪框展示裁剪框的缩放点cursor 鼠标样式四、裁剪框移动事件五、裁剪框缩放操作六、完成裁剪功能dr...
    99+
    2023-02-21
    JavaScript实现图片裁剪JavaScript图片裁剪 JavaScript图片
  • 基于JavaScript实现轮盘抽奖功能
    目录实现步骤html代码:css代码:js代码:不知道今天自己该吃什么,一招帮你解决选择困难症。通过html+css+js实现一个轮盘抽奖功能。我们可以将平时吃的饭菜输入到代码中,每...
    99+
    2023-01-13
    js轮盘抽奖 js抽奖
  • 基于JavaScript实现电子签名功能
    目录一:elesigncode拓展包下载二:elesigncode常用方法三:elesigncode实现实例1:html2:js一:elesigncode拓展包下载 1:github...
    99+
    2022-11-13
    JavaScript电子签名功能 JavaScript电子签名 JavaScript 签名
  • nodejs怎么实现发送邮箱验证码功能
    这篇文章主要讲解了“nodejs怎么实现发送邮箱验证码功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么实现发送邮箱验证码功能”吧!1、使用模块:nodemailer安装:n...
    99+
    2023-06-30
  • 怎么用JavaScript实现截屏功能
    这篇文章主要讲解了“怎么用JavaScript实现截屏功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用JavaScript实现截屏功能”吧!1.Blob的媒体类型必须是"i...
    99+
    2023-06-17
  • 怎么实现ghostscript沙箱绕过命令执行漏洞预警
    这篇文章给大家介绍怎么实现ghostscript沙箱绕过命令执行漏洞预警,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。0x00 漏洞背景2019年1月23日晚,Artifex官方在ghostscriptf的m...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作