1

我正在寻找一种脚本语言:

  1. 一种可嵌入 Java 的脚本语言
    • 实际上我的意思是不会作为本机代码执行,而是被解释的东西
  2. 安全(用户将上传他们的脚本,然后在服务器上执行)
    • 无法访问某些“沙盒”之外的任何内容,无法访问线程、I/O 等。
    • 只是流控制+算法/数据结构(可能是一些预定义的“类”,比如集合)+与显式提供的API交互
  3. 可以限制每个脚本的执行时间(n 秒或 n 条指令)
    • 如果语言被解释,这是可能的。例如:将每条指令替换为“检查我是否应该执行下一条指令并执行或退出”
  4. 具有简单易读的语法

最终目标是能够运行不受信任的代码,这些代码应该只能使用提供的 API,而不会破坏任何东西(比如进入无限循环/消耗太多资源/访问除了提供的 API 之外的任何东西)

有一些我可以使用的现有语言吗?

4

2 回答 2

1

首先,我想不出任何符合所有这些标准的语言。但分析需求以了解原因可能会有所帮助:

1) 一种可嵌入 Java 的脚本语言

确实存在可嵌入的脚本语言,尽管它取决于您对脚本语言的定义。简单的表达语言会是“脚本语言”吗?

2)安全(用户将上传他们的脚本,然后在服务器上执行)

这是困难的。问题是......你怎么知道语言实现是否安全?在简单的情况下(例如“计算器”语言)很容易,但是您如何证明(例如)Rhino Javascript 解释器或 JRuby 或 JPython 是安全的结论?(“安全”实际上是什么意思?)

注意:如果您的脚本语言允许脚本调用 Java 类或(不寒而栗)本机代码,那么您的问题现在大致相当于询问 Java 在 JVM 中运行任意不受信任的代码时是否安全。(答案是否定的……当然不会,因为 Java 中存在未修补/未发现的安全漏洞。)

3) 可以限制每个脚本的执行时间(n 秒或 n 条指令)

这在理论上是可行的,前提是该语言与 Java 世界的交互非常有限。但在一般情况下,您会遇到 Java“如何安全地停止不合作的线程”问题......在标准 JVM 中没有解决方案。

比较难处理的几个方面是:

  • 任何涉及线程的东西,
  • 需要很长时间的脚本到 Java 方法调用,
  • 阻塞 I/O。

(并且您还需要考虑可能会破坏您的系统的其他“活动”;例如,创建巨大的数据结构、锁定主机 JVM 中的对象,或执行旨在消耗系统级资源的事情;例如,填满文件系统或耗尽系统的熵池。)

4)具有简单易读的语法

这是您需要自己判断的事情。(可读性/简单性无法客观衡量......)

于 2013-05-04T23:45:22.590 回答
1

考虑Bean Scripting Framework,它将为您提供不同语言的选择。

于 2013-05-04T23:41:13.560 回答