【发布时间】:2019-03-16 06:04:30
【问题描述】:
我想让我们的用户用 JavaScript 编写字符串解析逻辑,然后在服务器上执行。
编辑(更多信息):
- Regex 不是一个选项,因为他们需要
if、else、switch等 - 我想避免创建自定义语言
- 这个想法是,如果用户知道 JS,他们可以编写自定义逻辑
我查看了 CodePen 的Stopping Infinite Loops,他们使用Esprima 生成Abstract Syntax Tree,然后重新生成我们使用Escodegen 的JavaScript。这种方法让我担心的是,有人仍然可以引入某种 Unicode hack。
【问题讨论】:
-
您最好的选择是使用
new Function() { arg1, arg2, arg3, code )(arg1, arg2, arg3)。这将创建一个隔离范围(全局范围除外,可以通过添加引用全局范围的局部变量来覆盖)。您可能希望在代码部分设置一些保护措施(例如禁止require语句)。如果代码应该返回一些东西,那么你可以捕捉到结果 -
在服务器上执行客户端JS代码?听起来不太好。只有当你解析代码并确保只调用允许的函数,没有死循环等。不容易。
-
听起来你需要一个沙盒。
-
根据解析逻辑的复杂程度,你可以想出自己的语法(支持'if'、'else'等),在服务器端解析并执行-边
标签: javascript node.js abstract-syntax-tree esprima escodegen