如何在沙盒中使用 Rhino for Java 运行 Javascript?

2022-09-01 06:11:55

我们的Java应用程序的一部分需要运行由非开发人员编写的javascript。这些非开发人员正在使用javascript进行数据格式化。(主要是简单的逻辑和字符串串联)。

我的问题是,如何设置这些脚本的执行,以确保脚本错误不会对应用程序的其余部分产生重大的负面影响。

  • 需要防范无限循环
  • 防止生成新线程。
  • 限制对服务和环境的访问
    • 文件系统(例如:如果心怀不满的脚本编写者决定删除文件)
    • 数据库(同样删除数据库记录)

基本上,我需要设置javascript范围,只包含他们需要的东西,而不是更多。


答案 1

为了防止无限循环,您可以在脚本运行时观察指令计数(这仅适用于解释型脚本,不适用于已编译脚本)。

Rhino JavaDocs 中有这样一个示例,用于防止脚本运行超过十秒钟:

 protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }

答案 2

要阻止Java类和方法访问,请查看...

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/