首页 > 其他分享 >如何在浏览器扩展中使用 eval 函数

如何在浏览器扩展中使用 eval 函数

时间:2023-08-07 21:11:32浏览次数:32  
标签:浏览器 函数 iframe html command eval message event

思路是把 iframe 作为沙箱环境,让 eval 在 iframe 中执行。

以 Chrome Manifest V2 为例。V3 可参考 Using eval in Chrome extensions - Chrome Developers

1. 在 manifest 文件中列出沙箱 html

{
  ...,
  "sandbox": {
     "pages": ["sandbox.html"]
  },
  ...
}

2. 加载沙箱 html

比如在 Manifest V2 中,可以将其放在背景页中(Manifest V3 取消了背景页):

<!-- background.html -->
<body>
    <iframe id="theFrame" src="sandbox.html" style="display: none"></iframe>
</body>

3. 在沙箱 html 中执行 eval 等特殊操作

<!DOCTYPE html>
<html>
<body>
    <script>
        // 接收消息
        window.addEventListener('message', async function (event) {
            const message = event.data
            let result = ''
            if (message) {
                switch (message.command) {
                    // 根据所收到消息的 command 值决定执行流程
                    case 'eval':
                        try {
                            result = eval(message.expression)
                            console.log(result)
                        } catch (error) {
                            event.source?.postMessage({ error, command: message.command }, event.origin)
                            return;
                        }
                    break
                }
            }
            // 传回消息给消息发起方
            event.source?.postMessage({ result, command: message.command }, event.origin)
        });
        
    </script>
</body>
</html>

4. 传递消息给沙箱 html

因为 sandbox 放在了 background.html 中,所以在 background.html 的 js 脚本中添加如下内容:

// 发送 eval 消息到 iframe
function sandboxEval(expression) {
    const iframe = document.getElementById('theFrame')
    const message = {
        command: 'eval',
        expression
    };
    iframe?.contentWindow?.postMessage(message, '*')
}

// 接收消息
window.addEventListener('message', function(event){
	const message = event.data
	if (message) {
		switch (message.command) {
			// 接收来自 iframe 的 eval 结果
			case 'eval':
				if (message.error) {
					console.error(message.error)
				} else {
					console.log(message.result)
				}
			break
		}
	}
})

// 调用函数进行测试
sandboxEval('1 + 1')

这样就间接实现了调用 eval 函数。

在模板引擎比如 NunjucksHandlebars 中,通常会使用到 eval 等类似比较“危险”的函数,遇到无法在浏览器扩展中使用这些库时可以类似解决。

参考:Using eval in Chrome extensions - Chrome Developersjavascript - JS templating in google chrome extension(manifest v2) - Stack Overflow

标签:浏览器,函数,iframe,html,command,eval,message,event
From: https://www.cnblogs.com/Higurashi-kagome/p/17612718.html

相关文章

  • 解决在Edge浏览器中使用不了(找不到)new bing的情况
    1.问题我们有时候看不到下图圈出部分的信息,无法找到NewBing的入口(这边是空的)2.解决方式1.选择右上角的三条杠,并选择其中的settings2.将其中的country一项改为外国即可......
  • 微信小程序13 在请求url获取返回值后修改data变量的一个问题,es6箭头函数或外部定义变
    在之前解密电话时,我们有请求wx的apiwx.request({url:'https://api.weixin.qq.com/sns/jscode2session',data:{},success:(re)=>{//console.log('re:'+JSON.stringify(re));this.......
  • go基础-函数
    概述在任何语言中函数都是极其重要的内容,业务功能都是由一个或多个函数组合完成。go语言是函数式编程语言,函数是一等公民,可以被传递、有函数类型,go语言有三种类型的函数,普通函数、匿名函数(Lambda函数)、方法函数。go语言函数有独特属性,可以有多个返回值,需要使用多个变量接收、函......
  • 浏览器打开首先是百度的界面,该如何修改
    浏览器打开首先是百度的界面,该如何修改打开电脑管家选择上网主页保护提供一些可用的主页bing:https://www.bing.com/Google:https://www.google.com/......
  • 支持多数据源联合查询的SQL运行引擎sycnany-SQL添加使用自定义函数
    在微服务和云原生愈发流行的今天,数据的分布也愈发脱离单库单机而更加复杂,使用的数据库类型也会更多,但业务的复杂依然会带来了大量的数据查询和导出需求,而很多时候我们很难为数据量的大部分系统创建完整的BI数仓系统,这时候你是不是觉得为这些需求查询和导出数据就会是一个十分困难且......
  • IE浏览器如何设置默认内核版本,IE11怎么设置默认以IE8的方式解析
    今天修复项目兼容性BUG,用IE11兼容模式调试IE8上的问题,发现每次关闭再打开F12都会以IE11的模式加载,网上搜了一下也没找到怎么设置,不过自己找了找,发现在仿真里可以保存当前设置,凑合可以用吧。但是关闭F12工具后,默认会切换回F11模式,可以通过保留仿真设置里防止其自动切回11。......
  • 编程范式 --- 函数式编程
    定义函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambdacalculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。--百度百科简单说,"函数式编程"是一种"编程范式"(programmingparadigm),也就是如何编写程序的方法论。它属于"结......
  • 无涯教程-Perl - endnetent函数
    描述此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。语法以下是此函数的简单语法-endnetent返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perluseSocket;while(($name,$aliases,$addrtype,$net)=getnetent())......
  • 无涯教程-Perl - endhostent函数
    描述此函数告诉系统您不再希望使用gethostent从hosts文件读取条目。语法以下是此函数的简单语法-endhostent返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perlwhile(($name,$aliases,$addrtype,$length,@addrs)=gethostent()){......
  • 无涯教程-Perl - dump函数
    描述此函数将当前正在执行的Perl解释器和脚本转储到核心转储中。使用undump程序,然后可以将转储的内核重新构造为可执行程序。执行新的二进制文件时,将从执行gotoLABEL开始。如果省略了LABEL,则从顶部重新启动程序。如果要使用转储来提高程序速度,请考虑按照perlcc中的描述生......