Giter VIP home page Giter VIP logo

eval5's Introduction

eval5

中文 | English

GitHub license npm npm bundle size

基于 TypeScript 编写的 JavaScript 解释器,支持完整 ES5 语法

支持浏览器、node.js、小程序等 JavaScript 运行环境

在线体验

更多示例

使用场景

  • 浏览器环境中需要使用沙盒环境执行 JavaScript 脚本
  • 控制执行时长
  • 不支持eval Function的 JavaScript 运行环境:如 微信小程序 demo we-script taro-script
  • 研究/学习用

支持 ECMAScript 版本

ES5

安装

npm install --save eval5

使用

Edit eval5

import { Interpreter } from "eval5";

const interpreter = new Interpreter(window, {
	timeout: 1000,
});

let result;

try {
	result = interpreter.evaluate("1+1");
	console.log(result);

	interpreter.evaluate("var a=100");
	interpreter.evaluate("var b=200");
	result = interpreter.evaluate("a+b");

	console.log(result);
} catch (e) {
	console.log(e);
}

参数

interface Options {
	// 默认为:0,不限制
	timeout?: number;
	// 根作用域,只读
	rootContext?: {} | null;
	globalContextInFunction?: any;
}

示例

import { Interpreter } from "eval5";

const ctx = {};
const interpreter = new Interpreter(ctx, {
    rootContext: window,
	timeout: 1000,
});

interpreter.evaluate(`
    a = 100;
    console.log(a); // 100
`);

window.a;//undefined

Interpreter

version

当前版本

global

默认值: {}

设置默认的全局作用域

Interpreter.global = window;
const interpreter = new Interpreter();
interpreter.evaluate('alert("hello eval5")');

globalContextInFunction

默认值: undefined

eval5 不支持 use strict 严格模式, 在非严格下的函数中this默认指向的是全局作用域,但在eval5中是undefined, 可通过globalContextInFunction来设置默认指向。

import { Interpreter } from "Interpreter";

const ctx = {};
const interpreter = new Interpreter(ctx);
interpreter.evaluate(`
this; // ctx
function func(){
    return this; // undefined
}
func();
`);
import { Interpreter } from "Interpreter";

Interpreter.globalContextInFunction = window;
const ctx = {};
const interpreter = new Interpreter({});
interpreter.evaluate(`
this; // ctx
function func(){
    return this; // window
}
func();
`);

原因,示例代码:

注意: alert异常

import { Interpreter } from "Interpreter";

Interpreter.globalContextInFunction = {};

const ctx = {alert: alert};

const interpreter = new Interpreter(ctx);

interpreter.evaluate(`
// throw Illegal invocation
alert('Hello eval5'); // 同 alert.call({}, 'Hello eval5')
`);

constructor(context = Interpreter.global, options?: Options )

构造函数

Interpreter 的实例方法

evaluate(code: string): any

执行给定的字符串代码,并返回最后一个表达式的值

import { Interpreter } from "Interpreter";

const interpreter = new Interpreter(window);

const result = interpreter.evaluate(`
var a = 100;
var b = 200;

a+b;

`);

console.log(result); // 300

appendCode(code: string): any

evaluate的别名

getExecutionTime(): number

获取上一次调用evaluate的执行时长

setExecTimeout(timeout: number = 0): void

设置执行时长

getOptions(): Readonly<Options>

获取解释器参数


evaluate(code: string, ctx?: {}, options?: Options)

执行给定的字符串代码,并返回最后一个表达式的值

注: 该函数每次执行都会创建一个新的解释器

import { evaluate } from "eval5";

evaluate(
	`
var a = 100;
var b = 100;
console.log(a+b);
`,
	{ console: console }
); // 200

evaluate(`
    a;
`); // a is not defined

Function

该函数会将Interpreter.global Interpreter.globalContextInFunction当作默认值并创建新的解释器

import { Function } from "eval5";

const func = new Function("a", "b", "return a+b;");
console.log(func(100, 200)); // 300

vm

查看 vm

  • vm.createContext
  • vm.compileFunction
  • vm.runInContext
  • vm.runInNewContext
  • vm.Script

License

MIT

相关

eval5's People

Contributors

bplok20010 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eval5's Issues

while循环内嵌switch continue造成的异常

var i = 1;
while(i){
    switch (i) {
        default:
            i = 0;
            continue;
    }
    console.log('after default')
}

在正常js执行环境下,continue会跳出while loop,不会输出console
然而通过eval5执行此段代码,continue仅跳出switch,会输出console

麻烦作者大大看下该种执行不一致的情况如何解决

解析网易云信 SDK报错

场景是,在微信小程序开发中引入云信SDK,把SDK打包到主包过大(业务需要不能放到分包),请求后端接口,把SDK放到缓存,这时候SDK是字符串了,用eval5解析成js执行。
报错如下:

vue.runtime.esm.js?9334:619 [Vue warn]: Error in mounted hook: "TypeError: Cannot read properties of undefined (reading '__core-js_shared__')"

存在沙盒逃逸和CSP Bypass风险

沙盒环境可以通过访问原型链获取Function,进一步执行JS代码

Object.prototype.constructor.constructor("return eval")()("alert(1)")

即使在非常严格的CSP防护下,比如script-src 'self' 'wasm-unsafe-eval'; object-src 'self',也存在通过原型链污染的方式进行逃逸,从而进一步执行JS代码

详细可见 https://blog.xlab.app/p/766bba8a/

最新的微信小程序审核未能通过。

你好,当前提审的小程序包中可能含有页面文件采用内置 JavaScript 解释器(如eval5、estime、evil-eval等)的方式,动态执行JS代码、对小程序wxml代码进行热更新。出于安全考虑,建议你立即调整技术方案,去除相关内容,消除风险

你试试转义这个就炸了

const a = "{'codeParam':'Bdate','nameParam':''}"
// 转义a

var interpreter = new Interpreter({});
const b = interpreter.evaluate(a);

执行eval时报栈溢出

你好请问一般什么情况下会出现栈溢出啊
image

不知道哪里的语法有问题导致的呢

干的漂亮!

小程序社区上看到过来。其实很想在社区评论,怕这东西被关注太多导致小程序的抵制措施,就没评论。

两千行代码就完成了js整个运行栈的模拟,看得心痒痒。想自己边撸边学,能推荐相关基础知识点的学习资料么?怎么穷举各种closure的处理情况的,是有相应标准么?十分感谢~~

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.