如何阻止java.io.file的使用

如何阻止java.io.file的使用,java,Java,我正在我的Linux服务器上创建一个网页,让我的学生在线编译Java代码:他们在文本区域/html中编写代码,然后按下按钮编译/执行程序 第一,我想做的是禁止使用“java.io.file”。。。 你有什么建议阻止这个访问吗? 我使用jdk.8.060 我不知道是否有人有一些信息可以提高我服务器上代码执行的安全性…你不能真正限制JVM中标准库的使用。。。至少不容易 如果你想防止你的学生弄乱你的文件系统,你应该利用操作系统来做到这一点。在用户帐户下执行代码,该帐户限制在特定目录下,显然没有sudo

我正在我的Linux服务器上创建一个网页,让我的学生在线编译Java代码:他们在文本区域/html中编写代码,然后按下按钮编译/执行程序

第一,我想做的是禁止使用“java.io.file”。。。 你有什么建议阻止这个访问吗? 我使用jdk.8.060


我不知道是否有人有一些信息可以提高我服务器上代码执行的安全性…

你不能真正限制JVM中标准库的使用。。。至少不容易

如果你想防止你的学生弄乱你的文件系统,你应该利用操作系统来做到这一点。在用户帐户下执行代码,该帐户限制在特定目录下,显然没有
sudo
权限

您的服务器应该已经设置为系统上的任何用户都无法访问敏感数据(如成绩)。

  • 定义和注册您自己的安全管理器将允许您限制代码的功能-有关详细信息,请参阅oracle文档

  • 请看一看,它允许您轻松创建非常灵活的沙盒来运行不受信任的代码

java沙盒允许安全地执行不受信任的代码,例如 应用程序中的第三方或用户生成的代码。信息技术 允许指定代码可能使用的资源和类, 因此,将执行与应用程序的执行分开 环境


您可以启用Java安全管理器

有关安全性的指南,请参阅。参见链接第8节“访问控制”

通过使用策略文件,您可以控制哪些文件(如果有)是允许的,但还有许多其他方面可以控制。请参阅链接以获取列表。以下是一些值得注意的问题:

  • FilePermission
    表示对文件或目录的访问
  • RuntimePermission
    用于运行时权限,例如阻止
    System.exit()
  • SocketPermission
    表示通过套接字访问网络
  • URLPermission
    表示访问给定URL定义的资源的权限

注意:即使有了安全管理器,您仍然应该使用操作系统文件安全性来保护您的服务器。

真的非常感谢,我想我达到了我的目标

我在路径“/home/policy”处创建了一个文件,其中包含以下行: 授予{ 权限java.lang.RuntimePermission“setSecurityManager”; 权限java.lang.RuntimePermission“createSecurityManager”; 权限java.lang.RuntimePermission“usePolicy”; };

我尝试了这段代码,它给了我一个错误,只读取一个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!");
   }
}
我希望这是正确的方式。。。谢谢你的帮助
托马斯谢谢你的回答。。。我现在使用这个命令行

 java -Xmx16M -Xms2M -Xss2M -Djava.security.manager Djava.security.policy=/home/java.policy Main
谢谢
如果代码包含
java.io.file
,Tom将抛出一个错误。如果学生试图使用该软件包中的任何内容,那么它就是导入的一部分。为什么只使用文件而不使用任何编写器或java.nio.Path?请看一看针对java应用程序中恶意代码的问题沙盒。那个问题可能是重复的。不,那不是正确的方法。您已经为jvm中运行的所有代码提供了设置securitymanager的功能,这意味着任何上载的代码都可以轻松禁用安全性!必须在命令行上指定SecurityManager配置。