首页 > 编程语言 >iframe实现与父页面跨域隔离的JavaScript 代码沙箱

iframe实现与父页面跨域隔离的JavaScript 代码沙箱

时间:2023-10-17 17:07:02浏览次数:56  
标签:跨域 URL JavaScript iframe 沙箱 data 页面

这篇文章主要介绍了使用iframe实现与父页面跨域隔离的JavaScript代码沙箱,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

目录

  • 正文
  • 1. iframe
  • 2. data URL
  • 3. 将 JavaScript 代码变成 data URL
  • 4. 如果需要获取执行结果的话,基于 postMessage 定制通信机制


正文

假如让你实现一个在线的 JavaScript 代码运行环境,要求用户代码不能对页面进行修改,以避免潜在的安全问题,你会怎么做?

使用 with?使用 proxy?OK ,都可以,但是这两种方法都需要关注很多细节,否则用户依旧有可乘之机,这样一来你的实现里面就会有一个很长长长长长长长的操作黑名单。

除此之外,我们还可以专门部署一个页面,将代码提到服务端渲染成页面,再通过 iframe 去访问,如果 iframe 与父页面之间是跨域的话可以达到很高的安全性——那么能不能不看后端的脸色,完全使用浏览器来实现类似的沙箱呢?

当然可以——


1. iframe

对前端页面而言,跨域是页面与页面之间的鸿沟,但这并不意味着我们必须重新打开一个页面来运行新的代码,因为我们可以使用 <iframe> 标签:

<iframe src="www.xxxx.xxx"></iframe>

对于同域的 iframe ,我们可以直接通过 .contentWindow 访问并操作它的全局对象,然后直接往里面执行 JavaScript:

document.querySelector('iframe')
  .contentWindow
  .eval('alert("hello world!");');

但是同域页面的子页面是可以与父页面进行互操作的,


2. data URL

你可能在一些页面里见过小图片不使用网络链接,而是采用一个 data:image/png;base64 xxxxxxx 风格的 URL ,这种 URL 就是 data URL

iframe实现与父页面跨域隔离的JavaScript 代码沙箱_html

除了 data URL 之外你可能还见过 blob:// 开头的 URL —— Object URL。不过 Object URL 与当前页面是同域的,而 data URL 与当前页面是跨域的。所以我们可以在 iframe 使用 data URL 来进行跨域隔离


3. 将 JavaScript 代码变成 data URL

我们可以直接将 JavaScript 片段变成 data:application/javascript, 的 URL ,但是这样有一个问题: iframe 打开这样的 URL 的时候,会显示代码原文而不是执行代码,这个行为其实和你直接在浏览器地址栏输入 JS 的 URL 是一样的。
所以我们需要将 JavaScript 代码拼接到 html 里面,再变成 data URL ,然后交给 iframe 去加载:

const javaScriptFragment = `
alert('hello world');
`;
const htmlFragment = `
<!doctype html>
<html>
  <head>
    <meta chatset="utf-8" />
  </head>
  <body>
    <script>${javaScriptFragment}</script>
  </body>
</html>
`;
const dataUrl = `data:text/html,${htmlFragment}`;
// 注意,如果代码片段中含有中文的话,需要使用 encodeURIFragment 转义 htmlFragment
document.querySelector('iframe').src = dataUrl;

4. 如果需要获取执行结果的话,基于 postMessage 定制通信机制

如果我们不但要做沙箱隔离,还被要求获取运行结果的话,则可以做一个通信机制,让 iframe 获取到用户代码执行结果, iframe 与父页面之间最好的跨域通信方法莫过于 postMessage
除了获取结果之外,还可以将通信机制进一步扩展成为 RPC ,这样可以实时修改页面里的代码来查看效果,类似于 codepen 。

具体实现与主题不是强相关,这里就不写了,更多关于JavaScript iframe页面跨域隔离的资料请关注51博客其它相关文章!

标签:跨域,URL,JavaScript,iframe,沙箱,data,页面
From: https://blog.51cto.com/u_16306937/7907706

相关文章

  • JavaScript中高阶函数的巧妙运用
    JavaScript中的高阶函数是指可以接受其他函数作为参数或者返回一个函数作为结果的函数,本文介绍了JS中一些高阶函数的妙用,希望对大家有所帮助目录1.接受函数作为参数的高阶函数2.返回函数的高阶函数3.同时接受和返回函数的高阶函数JavaScript中的高阶函数是指可以接受其他函数作为参......
  • How to export objects to a csv file using pure JavaScript All In One
    HowtoexportobjectstoaCSVfileusingpureJavaScriptAllInOne如何使用纯JavaScript将对象导出到CSV文件CSVCSV使用,/逗号分隔CSVfileseparatorCSV文件分隔符Comma-separatedvalues(CSV)Comma-separatedvalues,afileformatandextension......
  • JavaScript百炼成仙之前言
    JavaScript是一种轻量级的动态编程语言,在诞生之时,JavaScript并没有受到人们的过多关注,但是谁也想不到,在大前端快速风靡的今天,JavaScript已经成为当今编程世界中优雅而不可或缺的一员。如果你是一名编程初学者,刚刚学习完HTML和CSS,那你就不得不接触JavaScript了。刚开始,你会用jQuery......
  • Javascript报错:Uncaught TypeError: $(...).slide is not a function
    检查网站的时候,发现网页出现一个报错,UncaughtTypeError:$(...).slideisnotafunction同时,平时没有问题的轮播图,也不轮播了。检查并解决步骤如下: 1.顺着错误提示点过去,发现就是slide函数无法运行。查看相关介绍,表示是jq文件进行了重复引用,且版本不同 如下图相关资料描......
  • 2D物理引擎 Box2D for javascript Games 第四章 将力作用到刚体上
    2D物理引擎Box2DforjavascriptGames第四章将力作用到刚体上将力作用到刚体上Box2D是一个在力作用下的世界,它可以将力作用于刚体上,从而给我们一个更加真实的模拟。但是,如果你想要移动刚体,发射子弹,抛掷小鸟,驾驶汽车和当你在玩物理游戏时你看到的一切令人起劲的事情,那么你......
  • 《Head First JavaScript程序设计》高清高质量 原版电子书PDF+源码
    下载:https://pan.quark.cn/s/9b368a216582......
  • 从零开发一款图片编辑器(使用html5+javascript)
    最近开发了一个图片编辑器,类似于photoshop的网页版,源码参考自GitHub上,顺便也总结下使用html+js开发一个编辑器需要用到哪些知识点。预览地址:https://ps.gitapp.cngithub地址:https://github.com/photopea/photopea架构设计选型:jquery.js和blueimp-canvas.js都是强大的......
  • 深入理解 JavaScript 时间分片:原理、应用与代码示例解析
    JavaScript时间分片(TimeSlicing)是一种优化技术,用于将长时间运行的任务拆分为多个小任务,以避免阻塞主线程,提高页面的响应性和性能。本文将详细解释JavaScript时间分片的原理、应用场景,并通过代码示例帮助读者更好地理解和应用该技术。本文首发于:kelen.cc概念时间分片(TimeSl......
  • Javascript、axios、vue基础命令快速学习
    1.js:JavaScript基础学习JavaScript基础学习简单案例1.点击img1,则展示img1图片默认,点击img2则展示img2图片2.输入框鼠标聚焦onfocus后,显示小写toLowerCase(),失去焦点onblur后显示大写toUpperCase()3.点击全选按钮,所有复选框为被选中状态,点击反选则取消勾选状态JavaScrip......
  • [JavaScript]arguments对象
    当我们不确定有多少个参数传递的时候,可以使用arguments来获取。在JavaScript中,arguments实际上是充当函数的内置对象。所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。arguments展示形式是一个伪数组,可以进行遍历。伪数组具有以下特点:1.......