我们有一个Java应用程序,并希望使用内置的Javascript解释器(javax.script。*)运行不受信任的代码。
但是,默认情况下,解释器允许访问任何java类。例如,脚本中的“java.lang.System.exit(0)
”将关闭JVM。我相信这称为“Live Connect”,有关详细信息,请参阅Sun的“Java脚本编程程序指南”。
我想以某种方式关闭脚本访问Java类的能力,即我只希望脚本能够使用eval()
或put()
访问我专门注入的对象ScriptEngine
上的方法。
我找到了一些关于如何使用旧版独立版本的解释器(Rhino)实现此目的的文档,例如参见http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/
然而,在没有使用sun内部类的JDK 1.6中,这种方法是不可能的,因为ClassShutter等都是内部设置的,不能用公共方法覆盖。
我希望有一个简单的方法,不需要使用自定义的SecurityManager,ClassLoader等跳过复杂的环,但是找不到任何东西。
你会期望在不同的应用程序中围绕Javascript的安全公告的频率,会有一个简单的标志来禁用Live Connect!
答案 0 :(得分:1)
查看java sandbox library以及如何准确完成groovy(http://blog.datenwerke.net/2013/06/sandboxing-groovy-with-java-sandbox.html)所需内容的帖子。犀牛可以用类似的方式解决。
答案 1 :(得分:1)
如果给定的脚本包含Java脚本,则类加载器将尝试加载JavaMembers或其他类并触发类未找到的异常。这样,恶意脚本将被忽略而不执行。
请阅读ConfigJSParser.java和ConfigJSClassLoader.java文件以获取更多详细信息:
https://github.com/webuzz/simpleconfig/tree/master/js/im/webuzz/config