脚本语言 - 在服务器上执行

时间:2013-05-04 23:21:46

标签: java scripting-language

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

  1. 可嵌入Java的脚本语言
    • 实际上我的意思是不会作为本机代码执行,而是解释
  2. 安全(用户将上传他们的脚本,然后在服务器上执行)
    • 无法访问某些“沙盒”之外的任何内容,无法访问线程,I / O等。
    • 只是流量控制+算法/数据结构(可能是某些预定义的“类”,如集合)+与明确提供的API的交互
  3. 可以限制每个脚本的执行时间(n秒或n条指令)
    • 可以解释语言。例如:用“检查我是否应该执行下一条指令并执行它或退出”
    • 替换每条指令
  4. 具有简单易读的语法
  5. 最终目标是能够运行不受信任的代码,该代码只能使用提供的API,而不会破坏任何内容(例如输入无限循环/消耗过多资源/访问除提供的API之外的任何内容)

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  

1)可嵌入Java的脚本语言

当然存在可嵌入的脚本语言,但这取决于您对脚本语言的定义。简单的表达语言会成为“脚本语言”吗?

  

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

这很难。问题是......如果语言实现安全,你怎么能告诉?在简单的情况下(例如“计算器”语言)很容易,但是你如何证明(例如)Rhino Javascript解释器或JRuby或JPython是安全的? (“安全”究竟意味着什么?)

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

  

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

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

难以处理的几个方面是:

  • 涉及线程的任何事情,
  • 需要很长时间的脚本到Java方法调用,
  • 阻止I / O.

(并且您还需要考虑可能会破坏您的系统的其他“活动”;例如,创建大型数据结构,锁定主机JVM中的对象,或者设计用于消耗系统级资源的事物;例如,填写文件系统,或耗尽系统的熵池。)

  

4)具有简单易读的语法

这是你需要自己判断的东西。 (可读性/简单性不能客观地测量......)