gpt4 book ai didi

java - 如何对 Java 程序进行沙箱处理

转载 作者:行者123 更新时间:2023-12-01 12:39:53 25 4
gpt4 key购买 nike

我一直在尝试构建一个在线java编译器。我看过一些答案,例如 this one 。但还是有一些不明白的地方。

  1. 我现在在 PHP 中使用 java -Djava.security.manager HelloWorld.class 来运行用户的 Java 代码。但如 this one说,我需要在自己的线程中运行不受信任的代码。我真的需要构建线程吗?如果我不这样做,会导致什么? (所有用户代码都存储在不同的文档中,但类名可能相同)

  2. 如果我成功实现了线程和类加载器,我是否应该将这两个类放在不同的文件中?比如说,线程在一个文件中,类加载器在另一个文件中?

  3. 如果我用this one的方式说(这是线程+类加载器+安全管理器),这是否意味着我无法在命令行中编译代码?相反,我应该运行包含 thread + classloader + securitymanager 的 Java 文件并将一些变量传递给此类?

抱歉,请耐心解答我的问题。我懂一点Java,有太多简单的事情需要问。

最佳答案

java -Djava.security.manager -java.security.policy=filename.policy HelloWorld.class

其中 filename.policy 是硬盘驱动器上的一个没有任何条目的文件,将“充分”对代码进行沙箱处理,并防止其在您的 PC 上进行恶意写入/读取。

仅运行它的问题是允许无限循环,并且它可能会消耗所有 CPU 功率并且永远不会停止。

解决这个问题的方法确实是创建一个新的不同程序,该程序创建一个新的进程并启动它,并且只允许该进程在终止(暴力)之前存在一定的时间范围。

这是我为此编写的一些代码(从旧代码中删除):

class TestProcess {
private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool();

public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
List<String> out = new ArrayList<>();
IntegerCallable ic = new TestProcess.IntegerCallable(out);
int returnVal = timedCall(ic);
}

private static <T> T timedCall(Callable<T> c) throws InterruptedException, ExecutionException, TimeoutException {
FutureTask<T> task = new FutureTask<>(c);
THREAD_POOL.execute(task);
return task.get(3, TimeUnit.SECONDS);
}


public static class IntegerCallable implements Callable<Integer> {
private final List<String> output;
private Process process;

public IntegerCallable(List<String> out) {
this.output = out;
}

public Integer call() throws Exception {
ProcessBuilder pb = new ProcessBuilder("java", "-cp", "execCommand/", "-Djava.security.manager", "-Djava.security.policy=execCommand/exec.policy", "-Xmx64M", "Exec");
pb.redirectErrorStream(true);
process = pb.start();

try (final Scanner scan = new Scanner(process.getInputStream())) {
while (scan.hasNext())
output.add(scan.nextLine());
}
return process.exitValue();
}
}
}

ProcessBuilder pb = new ProcessBuilder("java", "-cp", "execCommand/", "-Djava.security.manager", "-Djava.security.policy=execCommand/exec.policy ", "-Xmx64M", "Exec"); 需要根据您的需要进行编辑。此行在名为 execCommand 的文件夹(也是 exec.policy 文件的位置)内执行 Exec.class 文件,并为其分配最大 64MB 堆。

关于java - 如何对 Java 程序进行沙箱处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25212787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com