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

Java脚本(JRuby,Jython,Groovy,BeanShell等)的安全性

戚阳
2023-03-14
问题内容

我希望运行一些未经验证的脚本(以尚未确定的语言编写,但是需要基于Java,因此JRuby,Groovy,Jython,BeanShell等都是候选人)。我希望这些脚本能够执行某些操作,并限制执行其他操作。

通常,我只是去使用Java的SecurityManager并完成它。这非常简单,可以让我限制文件和网络访问,关闭JVM的能力等。这对于我想阻止的高级任务非常有用。

但是有些事情我想允许的,但只能通过我提供的自定义API
/库来实现。例如,我不想允许直接的网络访问来打开到yahoo.com的URLConnection,但是如果使用MyURLConnection完成,则可以。那就是-
我要允许一组方法/类,然后我要限制的所有其他事情。

我不相信这种类型的安全性可以通过标准Java安全性模型来完成,但也许可以。我对脚本语言本身没有性能或灵活性的特定要求(这些脚本将是对具有基本循环/分支功能的API的简单过程调用)。因此,即使是用于检查每个反射调用的安全性检查的“大”开销对我来说也很好。

有什么建议吗?


问题答案:

免责声明:我不是Java安全API的专家,因此可能会有更好的方法来做到这一点。

我为基于Java的开源企业CMS
Alfresco工作,我们实现了与您所描述的类似的东西。我们希望允许脚本编写,但仅向脚本引擎公开Java
API的子集。

我们选择Rhino
Engine进行JavaScript脚本编写。它允许您控制哪些API可以使用JavaScript,还可以选择哪些类可用,哪些不可用。根据我们的工程师,间接费用大约为10%-不错。

除此之外,这也与您有关,在Java方面,我们使用Acegi(现在称为Spring
Security),并使用AOP对特定用户可以调用的方法进行基于角色的控制。授权非常有效。因此,实际上,首先通过JavaScript访问我们的应用程序的用户首先具有受限制的API,然后可以根据授权进一步限制该API。因此,您可以使用AOP技术进一步限制可以调用的方法,从而允许在其他脚本语言(例如Groovy等)中公开该方法。我们也正在添加这些方法,并确信我们的底层Java
API保护用户免受未经授权的访问。



 类似资料:
  • 我的Jython脚本调用了一些我用Java编写的代码(因为我更喜欢Java多线程)。现在,我需要从Java调用一个Jython方法(否则我必须用Java重写它)。 从Jython中驱动Java很容易,设置Java是主程序,Jython是从程序也很简单,但如何设置它以使它们能够相互调用并不明显。 官方文档包含了一篇关于这一切的非常长的文章:第10章:Jython和Java集成,这使得这项任务乍一看似

  • 背景 我正在协助建立一个基于网络的界面来编程简单的AI,它玩游戏和与其他AI竞争。 系统的一个主要要求是用户提交的代码被验证在服务器上运行是安全的。也就是说,如果提交的代码访问文件系统,我们需要拒绝提交。 目前,该系统使用Java作为提交语言,并执行字节码分析,根据白名单检查提交代码使用的类。如果提交使用不允许的类,则拒绝提交。 我目前正在探索在Python中支持提交的选项,Python(使用Jy

  • 我对Groovy很陌生,我想从主groovy脚本中的另一个groovy脚本中导入一个类。我已经看到了这篇文章。但是由于环境限制,我不能使用GroovyClassLoader之类的函数或导入任何库/框架。我唯一的可能性是使用评估方法。 我试过这个: 主脚本(评估不会抛出任何错误) Csvreader脚本 但是,我需要通过evaluate调用传递参数(并将方法移到类之外),或者需要创建类的实例。不幸的

  • 问题内容: 我是Jenkins中使用的Groovy脚本的新手。我的问题是,我们如何根据作业名称和内部版本号获取作业的时间戳? 示例 :我想获取“ MyDeployJob”(JobName)的时间戳,并获取BuildNumber-105的时间戳。 我尝试使用方法方法,但无法正常工作。另外,我发现环境变量具有时间戳,但是我无法弄清楚如何使用Groovy Script获取细节。请帮助。 提前致谢。 问题

  • **抱歉,我对python和java都很陌生,所以我可能不认识到这已经得到了回答,只需要根据我的情况进行调整。 本质上,我有一个在python环境中运行的脚本管理器,我需要将数据传递给bonej插件进行分析,然后该插件将返回一个数组,另一个python脚本将使用该数组进行进一步分析。 我已经被引导到jython来实现这一点,但我不知道如何像导入模块一样导入imageJ。 我知道我可以简单地从命令行

  • 我有一些库脚本:lib1。groovy: lib2.groovy: lib3.groovy: 并希望在另一个脚本中使用它们:conf.groovy: conf.groovy是由用户配置的,他不知道我的后台lib脚本!他只知道提供的方法/任务:a()、b()、c()。实际上,我创建lib脚本是为了简化用户。 有没有办法将lib目录中的所有脚本(脚本lib1、lib2m、lib3)都包含到conf.g