我在我的 Java 应用程序中使用 JRuby 来允许用户运行他们的脚本。应用程序正常功能所需的操作集并不大。该脚本应控制 Java 代码中的一些变量,并在执行期间更改流程。
所以我想有机会限制允许的操作数量。说,我不希望用户有权访问文件系统。
f = File.new("myfile.txt", "w")
f.puts( "Hello!" )
f.close
这应该被禁止。
我该怎么做这样的设置?我唯一的想法是在启动之前解析用户脚本并将脚本与允许操作的白名单进行比较。
您应该做的是创建允许命令的白名单。如果发现脚本包含不在白名单中的命令,则需要拒绝整个脚本。正如 Andrew Thompson 所指出的,安全管理器是一个很好的额外层,但这并不是安全层的终点。我不认为在沙盒小程序中运行真的会为您带来那么多,因为您仍然必须确定脚本是否有效。
白名单示例
通常,当您生成白名单时,您希望用户能够从中选择的选项/命令数量有限,其余的将被丢弃。您将创建一些枚举或最终数据结构(以最大程度地减少其在运行时被恶意程序修改的能力)。如果你希望用户只能选择调用你的函数foo
而不是bar
你可以写这样的东西,这完全是原始的,但说明了这个概念:
class WhiteList
{
allowedCommands = ["foo"];
}
在你的主要是这样的:
class Main
{
for(Command command in userInput)
{
if(command not in allowedCommands)
{
log security message;
continue/break
}
}
}
为用户代码安装1。或者更简单,从沙盒小程序或JWS启动的应用程序运行代码。SecurityManager
安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行可能不安全或敏感的操作之前确定该操作是什么以及是否在允许执行该操作的安全上下文中尝试该操作。应用程序可以允许或禁止该操作。