有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中创建沙盒可插拔应用程序的安全性

这个问题与{a1}非常相似,但我需要集中讨论不同的问题

假设我有一个具有大型数据库(即电影数据库)的应用程序。应用程序的用户应该能够添加自己的插件并能够运行它们

场景可能如下所示:

  • 启动主应用程序
  • 放置统计插件。/app/plugins目录中的jar
  • 告诉主应用加载新插件
  • 告诉应用程序列出插件
  • 选择一个插件(例如刚刚安装的插件)并运行它
  • 统计插件。jar查询数据库中关于电影的信息,统计恐怖电影的数量,并返回计数
  • 主应用程序显示结果


每个插件可以有两个被调用的标准方法(一个公共的Plugin接口),例如onInitializeonRun

主应用程序需要保证的是,如果插件崩溃(例如除以0),主应用程序将保持稳定(例如,将显示错误对话框,但不会自行崩溃)。还可以限制执行时间并检查插件正在执行的操作

这一切归结为一个沙盒插件环境。最重要的事情是:插件风格的扩展性和插件的沙箱化-只允许安全操作(例如读取数据库,但不更新它)

插件不必用Java编写。它需要以某种方式可执行。。。它甚至可能是一个JavaScript文件。。如果可能的话

你将如何处理这样的任务


共 (4) 个答案

  1. # 1 楼答案

    我认为java不适合运行不受信任的插件。一旦插件运行,它将能够完成宿主程序所能做的一切

    您需要创建自己的抽象层和沙盒,其中包含您需要的“安全”操作 作为主程序的一部分执行。这个插件可以提供你可以解释的数据 作为一个项目。你不能让插件运行

  2. # 2 楼答案

    您可能可以使用Java Authentication and Authorization Service实现这样一个可插拔的体系结构。使用JAAS,您可以执行具有受限访问控制权限的插件。ACL可以限制打开套接字连接、写入文件、打开数据库连接等

    对于数据库访问,您可以通过JNDI数据源提供与插件的数据库连接,并使用只能读取而不能更新数据库的DB用户配置数据源

  3. # 3 楼答案

    您应该考虑使用Security Manager,也许还可以定义一些自己的权限。在定义策略时,已经有一组常用权限可供使用

    请注意,对RDBMS的只读访问不太可能在Java环境的范围内。相反,这通常是使用一个单独的RDBMS用户来处理的,该用户具有特定的权限。您的框架需要使用该用户名连接到数据库

  4. # 4 楼答案

    可以使用您自己的安全策略文件和安全管理器执行类似的操作。基本上,授予你自己的JAR AllPermission和插件JAR更少的权限。这样一来,您就无法限制不受信任的小程序可以使用的操作,所以编写一个创建无止境循环或分配100GB内存的线程仍然是可能的

    为了允许数据库访问,但只允许特定的操作,您必须提供自己的API(在一个受信任的JAR中),该API将只提供受信任的操作(如首先验证SELECT语句)并调用AccessController。如果信任它执行操作,则会在之后获得doPrivileged。由于不受信任的代码可能无法打开套接字连接(除非特定主机允许),因此该代码将无法以这种方式干扰数据库

    然而,正确实现安全管理器可能很棘手(在实现中经常会发现错误,比如最近的Batik Squiggle),因此使用模拟语言(例如JavaScript/Rhino)可能更安全