我们java应用程序需要运行javascript是由非开发。这些非开发人员使用的javascript数据的格式。(简单的逻辑和串联大).

我的问题是如何设置执行这些脚本,以确保脚本错误没有一个主要负面影响的其他应用程序。

  • 需要防止无限循环
  • 防止产生新的螺纹。
  • 限制获得服务和环境
    • 文件系统(例如:如果一个心怀不满的编剧决定删除的文件)
    • 数据库(同事删除的数据库记录)

基本上我需要设置javascript范围,以仅包括他们需要什么并没有更多。

有帮助吗?

解决方案

为防止无限循环,你需要把它放在一个单独的进程,以便它可以杀死。

防止建立线,你会需要延长SecurityManager(默认执行允许不受信任的代码的访问非根线组)。

Java安全不会允许你以防止进入文件系统。

对数据库的限制,可能可以使用的标准SQL用户的安全,但这是相当薄弱。否则,需要提供一个API,强制执行限制。

编辑:我应该指出,版本的犀牛提供与JDK6有安全完成的工作上,但不包括编译器。

其他提示

为防止无限循环,可以观察到的指示数作为脚本运行(这仅适用与解释的脚本,不用编制的)。

还有这个 例如在犀牛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();
     }
 }

来块Java类和方法的访问有一种看看...

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

我只是跑过这个博客,这似乎是有用的沙盒或多或少的东西(不仅仅是犀牛):

http://calumleslie.blogspot.com/2008/06/simple-jvm-sandboxing.html

如果你是在寻找纯粹的JavaScript的功能只在这里是一个解决方案的基础上JAVA嵌入犀牛图书馆没有进口任何第3-缔约方的图书馆:

  1. 找出JavaScript脚引擎厂类名称的ScriptEngineManager#getEngineFactories
  2. 载脚本机厂类中的一类新的加载程序,在其JavaMembers或其他相关的课程将会被忽略。
  3. 呼叫#getScriptEngine上装载的脚引擎厂和eval脚本上返回脚本的引擎。

如果给定的脚本中包含Java脚本,类装载机会尝试载JavaMembers或其他类并引发类未发现异常。在这种方式,恶意脚本将可以忽略而没有执行。

请阅读ConfigJSParser.java 和ConfigJSClassLoader.java 文件的更多详细信息:

https://github.com/webuzz/simpleconfig/tree/master/src/im/webuzz/config

Javascript是单线和不可能访问该文件系统,所以我不认为你需要担心的那些。我不确定如果有一种方法来设置一个超时为防止无限循环,但是你可以始终产生一个(Java)线执行的剧本,然后杀死的线经过这么多的时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top