当前位置: 首页 > 面试题库 >

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

万俟穆冉
2023-03-14
问题内容

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

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

  • 需要防范无限循环
  • 防止产生新线程。
  • 限制访问服务和环境
    • 文件系统(示例:如果心怀不满的脚本编写者决定删除文件)
    • 数据库(用同样的方法删除数据库记录)

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


问题答案:

为了防止无限循环,您需要将其放在单独的进程中,以便将其杀死。

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

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

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

编辑:我应该指出,随JDK6一起提供的Rhino版本已经在其上完成了安全工作,但不包括编译器。



 类似资料:
  • 问题内容: 在node.js中安全地运行(可能是恶意的)用户提交的脚本有哪些选项?是否在防止代码访问敏感数据和API的环境中? 是一个诱人的起点…但是似乎那里存在已知问题。 在沙箱模块看起来很有趣,但使用也使我的有点持怀疑态度。 问题答案: 您应该始终在单独的过程中运行不受信任的代码,这正是沙盒模块所做的。一个简单的原因是它将冻结节点。 它从产生一个单独的进程开始,随后将在其stdout上将序列化

  • 安全是Chromium最重要的目标之一。安全的关键在于理解下面这点:在我们完整地理解了系统在所有可能的输入组合下表现出的行为之后,我们才能够真的保证系统安全。对于像Chromium这样庞大而多样化的代码库,推理它的各个部分可能的行为的组合几乎是不可能的。沙箱的目标是提供这样一种保证:不论输入什么,保证一段代码最终能或不能做的事情。 沙盒利用操作系统提供的安全性,允许不能对计算机做出持久性改变或者访

  • Jinja2 沙箱用于为不信任的代码求值。访问不安全的属性和方法是被禁止的。 假定在默认配置中 env 是一个 SandboxedEnvironment 实例,下面的代码展示 了它如何工作: >>> env.from_string("{{ func.func_code }}").render(func=lambda:None) u'' >>> env.from_string("{{ func.fu

  • Jinja2 沙箱用于为不信任的代码求值。访问不安全的属性和方法是被禁止的。 假定在默认配置中 env 是一个 SandboxedEnvironment 实例,下面的代码展示 了它如何工作: >>> env.from_string("{{ func.func_code }}").render(func=lambda:None) u&"" title="jinja2.sandbox.Security

  • 问题内容: 我想创建一个Web应用程序,该应用程序将允许用户上传一些C代码,并查看其执行结果(该代码将在服务器上编译)。用户不受信任,这显然会带来巨大的安全隐患。 因此,我需要为应用创建某种沙箱。在最基本的级别上,我想将对文件系统的访问限制在某些指定的目录中。我无法直接使用chroot jails,因为Web应用程序未以特权用户身份运行。我想设置监狱的suid可执行文件是一个选择。 上载的程序会很

  • 我编写了一个简单的RMI服务器,并为它提供了一个默认的: 以下是服务器的代码(来自Oracle RMI教程,但我添加了RMISecurityManager): } 我这样做: