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

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

How can you run Javascript using Rhino for Java in a sandbox?

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

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

  • 需要防范无限循环
  • 防止产生新线程。
  • 限制对服务和环境的访问

    • 文件系统(例如:如果一个心怀不满的脚本编写者决定删除文件)
    • 数据库(同样删除数据库记录)

基本上,我需要将 javascript 范围设置为仅包含他们需要的内容,而不再包含更多内容。


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

Rhino JavaDocs中有这个例子可以防止脚本运行超过十秒:

1
2
3
4
5
6
7
8
9
10
11
12
 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/


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

为了防止创建线程,您需要扩展 SecurityManager(默认实现允许不受信任的代码访问非根线程组)。

Java 安全确实允许您阻止对文件系统的访问。

对于数据库限制,您也许可以使用标准的 SQL 用户安全性,但这很弱。否则,您需要提供一个 API 来强制执行您的限制。

编辑:我要指出的是,JDK6提供的Rhino版本已经完成了安全工作,但不包括编译器。


我刚刚看到这篇博客文章,它似乎对沙盒或多或少有用(不仅仅是 Rhino):

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


如果您只寻找纯 JavaScript 函数,这里有一个基于 JDK 嵌入式 Rhino 库的解决方案,无需导入任何第三方库:

  • 通过 ScriptEngineManager#getEngineFactories 找出 JavaScript 脚本引擎工厂类名
  • 在新的类加载器中加载脚本引擎工厂类,其中 JavaMembers 或其他相关类将被忽略。
  • 在加载的脚本引擎工厂上调用 #getScriptEngine 并在返回的脚本引擎上调用脚本。
  • 如果给定的脚本包含 Java 脚本,类加载器将尝试加载 JavaMembers 或其他类并触发类未找到异常。这样,恶意脚本将被忽略而不执行。

    详情请阅读 ConfigJSParser.java 和 ConfigJSClassLoader.java 文件:

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


    Javascript 是单线程的,不能访问文件系统,所以我认为你不必担心这些。我不确定是否有办法设置超时以防止无限循环,但您总是可以生成一个执行脚本的 (Java) 线程,然后在这么长时间后终止该线程。


    推荐阅读

      linux运行图形界命令?

      linux运行图形界命令?,系统,密码,地址,电脑,图形界面,地方,工具,界面,终端,

      linux怎样运行命令?

      linux怎样运行命令?,系统,工作,信息,基础,地址,命令,目录,工具,密码,一致,Lin

      linux操作数据库命令?

      linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

      linux下载数据命令?

      linux下载数据命令?,软件,工具,数据,系统,代理,官网,网络,名称,网址,盘中,在l

      linux编译完运行命令?

      linux编译完运行命令?,系统,代码,环境,工具,信息,命令,文件,程序,终端,编辑,

      linux命令程序运行?

      linux命令程序运行?,状态,系统,服务,情况,命令,进程,软件,数据,发行,时间,Lin

      linux运行脚本命令?

      linux运行脚本命令?,系统,代码,服务,文件,工具,平台,网站,脚本,命令,方法,Lin

      做数据linux常用命令?

      做数据linux常用命令?,工作,系统,基础,网络,数据,标准,管理,工具,地址,命令,l

      linux命令后加运行?

      linux命令后加运行?,状态,暂停,工具,单位,进程,环境,网络,系统,权威,第一,mv

      ssh运行linux命令?

      ssh运行linux命令?,地址,服务,系统,软件,工具,电脑,网络,密码,名称,命令,在li

      linux查重复数据命令?

      linux查重复数据命令?,工具,数据,系统,电脑,名字,资料,代码,百度,标准,技术,

      linux运行多个命令?

      linux运行多个命令?,环境,软件,系统,工作,服务,连续,命令,指令,分号,冲突,lin

      linux数据库升级命令?

      linux数据库升级命令?,系统,信息,时间,最新,网络,名字,地址,管理,简介,传播,l

      linux运行命令查看?

      linux运行命令查看?,系统,信息,状态,命令,名称,情况,地址,软件,进程,第一,lin

      linux中命令运行软件?

      linux中命令运行软件?,软件,系统,名称,工具,电脑,位置,环境,中心,在线,初级,

      脚本linux上运行命令?

      脚本linux上运行命令?,工具,代码,时间,密码,系统,环境,名字,位置,第三,下来,t

      linux运行命令的脚本?

      linux运行命令的脚本?,系统,服务,工具,脚本,意外,技术,分析,文件,方法,命令,s

      linux影藏运行命令?

      linux影藏运行命令?,档案,电脑,标准,设备,代码,工具,系统,查询系统,暂停,命

      数据库导出linux命令?

      数据库导出linux命令?,密码,数据,数据库,情况,地址,系统,工具,网上,名字,命