作为我正在开发的Java游戏的一部分,我计划嵌入Groovy(或可能是其他一些)脚本语言以允许更低级别的mod支持以及对话和任务文件等方式在游戏中产生效果世界。然而,我的目的和潜在的mod作者的目的可能会有所不同,如果可能的话,我希望避免删除那些不危险的语言特征。
虽然我的具体需求当然会因公共规范而异,但我仍然很好奇是否有任何普遍认可的白名单(无论多么简短)的java包和类可以被访问而对用户没有重大风险
答案 0 :(得分:4)
我很好奇是否有任何普遍认同的白名单(无论多么短)的java包和类,可以在不对用户造成重大风险的情况下进行访问。
是的,有白名单,但我不知道“他们是如何”普遍同意的。社区共识是审查白名单的一种方式,但您也可以查看列表创建者的体验,看看他们的过程是否有意义。
Joe-E项目提出了Java的“驯服”,其中一个部分是按类/方法/字段列出的核心库的白名单。例如,对于StringBuilder
,StringBuilder.safej说
# Manually verified.
class("java.lang.StringBuilder",
static(constructor("StringBuilder()"),
constructor("StringBuilder(CharSequence)"),
...
method(suppress, "insert(int, Object)", comment("calls toString on arbitrary object")),
# auto-generated safej: default deny everything
class("java.lang.Runtime",
static(method(suppress, "getRuntime()", comment("default deny")),
method(suppress, "runFinalizersOnExit(boolean)", comment("default deny"))),
...
要了解驯服,请参阅Joe-E paper说明:
4.2.1驯服Java类库
Java库定义了许多有侧面的静态方法 对外界的影响,以及许多建设者 创建允许类似效果的对象。这是Java中环境权限的主要来源。例如,文件 有一个构造函数,它将获取一个字符串并返回一个对象 用该名称表示文件。结果对象 可用于读取,写入或删除命名文件。没有Java安全管理器的显式访问控制或 在操作系统中,这允许任何Java代码完全控制文件系统。在Joe-E中,我们希望确保这一点 如果文件的功能,代码只能访问文件 (或超级目录)在该代码的动态范围内。
因此,我们不得允许上述文件 Joe-E全球范围内的构造函数。 我们定义了仅包含的Java库的子集 那些兼容的构造函数,方法和字段 原则是必须通过a授予所有特权 能力。我们将此活动称为驯服,因为它变成了一个 将不守规矩的类库转换为功能安全的子集。 JoeE veri fi er允许Joe-E程序仅提及类, 此驯服子集中的构造函数,方法和字段。如果 源代码提到了这个子集之外的任何东西, Joe-E veri fi er将此视为错误。
Taming有助于消除环境权限,因为它确保不提供提供环境权限的库方法 可以访问Joe-E程序。我们也使用驯化来揭露 只提供提供功能规则的Java库的子集。
答案 1 :(得分:1)
我怀疑你会发现,不是从通用编程语言开始,而是想弄清楚如何让人们访问它并使其安全,从另一个方面来说更安全。
我的方法是从特定于域的语言开始,并让它访问沙箱 - 您希望并且乐于让modder影响的程序环境的各个方面。
答案 2 :(得分:0)
我会尝试模拟Java applet沙箱模型。如果沙箱足够安全,可以在我的电脑上从互联网上运行任意代码,那么它应该对您的用户脚本足够安全。好吧,您可能不希望用户脚本弹出某个GUI窗口,因此您需要限制权限而不是applet沙箱。