【问题标题】:What's the safest way to allow JavaScript written on the client, to be executed on the server?允许在客户端编写的 JavaScript 在服务器上执行的最安全方法是什么?
【发布时间】:2019-03-16 06:04:30
【问题描述】:

我想让我们的用户用 JavaScript 编写字符串解析逻辑,然后在服务器上执行。

编辑(更多信息)

  • Regex 不是一个选项,因为他们需要ifelseswitch
  • 我想避免创建自定义语言
  • 这个想法是,如果用户知道 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


【解决方案1】:

最安全的方法是为 javascript 的某些子集(或任何其他脚本语言)或您自己的域特定语言创建自己的解析器/解释器。虽然工作量很大,但仍然比在服务器上维护沙盒 JavaScript 虚拟机并与之通信要容易和安全得多。

【讨论】:

  • 感谢您的回答。是的,我同意,这是我最初的想法,但你说得对,工作量很大,所以我认为最好先询问社区。之前一定有人这样做过
  • @JohnDoherty 我猜有很多玩具语言解释器,但我们不知道哪一个符合您的特定要求(“字符串解析”)。
【解决方案2】:

一个想法:

  1. 用户在网页上编写自定义函数

  2. 网页从服务器获取数据

  3. 自定义函数应用于客户端数据

  4. 将结果发送回服务器(确保结果不受影响)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2015-11-24
    相关资源
    最近更新 更多