我正在Linux服务器上创建一个网页,让我的学生在线编译Java代码:他们用textarea / html编写代码,然后按一个按钮编译/执行他们的程序
第一个认为我想做,它禁止使用“java.io.file”...... 您有阻止此访问的任何提示吗? 我用的是jdk.8.0_60
我不知道是否有人提供了一些信息来提高我服务器上代码执行的安全性......
答案 0 :(得分:3)
您可以启用Java安全管理器。
有关安全性的指南,请参阅this page。参见第8节"访问控制" Java™ Security Overview链接。
通过使用策略文件,您可以控制允许哪些文件(如果有),但还有许多其他方面可以控制。有关列表,请参阅Policy Permissions链接。以下是一些值得注意的:
FilePermission
表示对文件或目录的访问。RuntimePermission
用于运行时权限,例如阻止System.exit()
。SocketPermission
表示通过套接字访问网络。URLPermission
表示访问由给定网址定义的资源的权限。注意:即使使用安全管理器,您仍应使用操作系统文件安全保护服务器。
答案 1 :(得分:2)
您无法真正限制JVM中标准库的使用......至少不容易。
如果您想阻止学生搞乱您的文件系统,您应该利用操作系统来做到这一点。在仅限于特定目录且明显没有sudo
权限的用户帐户下执行代码。
您的服务器应该已经设置好,以便系统上的任何用户都无法访问敏感数据(例如成绩)。
答案 2 :(得分:0)
定义并注册您自己的安全管理器将允许您限制代码的作用 - 请参阅SecurityManager的oracle文档。
查看java-sandbox project,它可以让您轻松创建非常灵活的沙箱来运行不受信任的代码。
java-sandbox允许安全地执行不受信任的代码,例如 应用程序中的第三方或用户生成的代码。它 允许指定代码可能使用的资源和类, 因此,将执行与应用程序的执行分开 环境。
答案 3 :(得分:0)
真的,谢谢,我想我达到了目标......
我在路径" / home / policy"创建了一个文件。其中包含以下行: 授予{ permission java.lang.RuntimePermission" setSecurityManager&#34 ;; permission java.lang.RuntimePermission" createSecurityManager&#34 ;; 权限java.lang.RuntimePermission" usePolicy&#34 ;; };
我尝试这个代码,只给你一个正确读取777文件的错误:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;
public class Main extends SecurityManager {
public static void main(String[] args) {
// set the policy file as the system securuty policy
System.setProperty("java.security.policy", "file:/home/java.policy");
// create a security manager
Main sm = new Main();
// set the system security manager
System.setSecurityManager(sm);
System.out.println("Test");
//lit un fichier
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("/home/a.txt"));
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
// print a message if we passed the check
System.out.println("Allowed!");
}
}
我希望它是正确的方式......感谢您的帮助 托马斯
答案 4 :(得分:0)
感谢您的回答......我现在使用此命令行
java -Xmx16M -Xms2M -Xss2M -Djava.security.manager Djava.security.policy=/home/java.policy Main
由于 汤姆