delight-nashorn-sandbox, 在Java中,使用Nashorn执行JavaScript的沙箱

分享于 

3分钟阅读

GitHub

  繁體
A sandbox for executing JavaScript with Nashorn in Java.
  • 源代码名称:delight-nashorn-sandbox
  • 源代码网址:http://www.github.com/javadelight/delight-nashorn-sandbox
  • delight-nashorn-sandbox源代码文档
  • delight-nashorn-sandbox源代码下载
  • Git URL:
    git://www.github.com/javadelight/delight-nashorn-sandbox.git
    Git Clone代码到本地:
    git clone http://www.github.com/javadelight/delight-nashorn-sandbox
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/javadelight/delight-nashorn-sandbox
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Nashorn沙箱

    使用nashorn引擎在Java应用程序中执行JavaScript的安全沙箱。

    另请参见rhino Sandbox

    用法

    默认情况下,沙箱阻止对所有Java类的访问。

    必须明确允许JavaScript中使用的类。

    NashornSandbox sandbox =NashornSandboxes.create();
    sandbox.allow(File.class);
    sandbox.eval("var File = Java.type('java.io.File'); File;")

    或者,可以将java对象注入为JS全局变量

    NashornSandboxes sandbox =NashornSandboxes.create();
    sandbox.inject("fromJava", newObject());
    sandbox.eval("fromJava.getClass();");

    沙箱还允许限制脚本的CPU时间和内存使用,这允许终止包含无限循环和其他有问题代码的脚本。

    NashornSandbox sandbox =NashornSandboxes.create();
    sandbox.setMaxCPUTime(100);
    sandbox.setMaxMemory(50*1024);
    sandbox.allowNoBraces(false);
    sandbox.setMaxPreparedStatements(30); // because preparing scripts for execution is expensivesandbox.setExecutor(Executors.newSingleThreadExecutor());
    sandbox.eval("var o={}, i=0; while (true) {o[i++]='abc';};");

    这个代码将引发ScriptCPUAbuseException。

    要调试沙箱生成的代码,请使用log4j.properties file按如下方式激活它调试模式:

    
    log4j.logger.delight.nashornsandbox.internal.NashornSandboxImpl=DEBUG
    
    
    
    

    这将在控制台上输出生成的JS,如下所示:

    
    --- Running JS ---
    
    
    var __it = Java.type('delight.nashornsandbox.internal.InterruptTest');var __if=function(){__it.test();};
    
    
    while(true) {__if();
    
    
     i = i+1;
    
    
    }
    
    
    --- JS END ---
    
    
    
    

    Maven

    只需将以下依赖项添加到项目中。

    
    <dependency>
    
    
     <groupId>org.javadelight</groupId>
    
    
     <artifactId>delight-nashorn-sandbox</artifactId>
    
    
     <version>[insert latest version]</version>
    
    
    </dependency>
    
    
    
    

    JAVA  Javascript  EXE  EXEC  SAN  沙箱