你可以如何运行Javascript使用犀牛Java在沙盒?
-
01-07-2019 - |
题
我们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-缔约方的图书馆:
- 找出JavaScript脚引擎厂类名称的ScriptEngineManager#getEngineFactories
- 载脚本机厂类中的一类新的加载程序,在其JavaMembers或其他相关的课程将会被忽略。
- 呼叫#getScriptEngine上装载的脚引擎厂和eval脚本上返回脚本的引擎。
如果给定的脚本中包含Java脚本,类装载机会尝试载JavaMembers或其他类并引发类未发现异常。在这种方式,恶意脚本将可以忽略而没有执行。
请阅读ConfigJSParser.java 和ConfigJSClassLoader.java 文件的更多详细信息:
https://github.com/webuzz/simpleconfig/tree/master/src/im/webuzz/config
Javascript是单线和不可能访问该文件系统,所以我不认为你需要担心的那些。我不确定如果有一种方法来设置一个超时为防止无限循环,但是你可以始终产生一个(Java)线执行的剧本,然后杀死的线经过这么多的时间。