【问题标题】:How block the use of java.io.file如何阻止使用java.io.file
【发布时间】:2015-09-25 14:10:21
【问题描述】:

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

第一个想我想做的,就是禁止使用“java.io.file”... 您有任何阻止此访问的提示吗? 我用 jdk.8.0_60

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

【问题讨论】:

  • 如果代码中包含java.io.file,则抛出错误。如果学生尝试使用该包中的任何内容,则它是导入的一部分。
  • 为什么只有文件而不是任何作者或 java.nio.Path?
  • 查看this answer 的问题Sandbox 针对Java 应用程序中的恶意代码。这个问题可能是重复的。

标签: java


【解决方案1】:

您可以启用 Java 安全管理器。

有关安全性的指南,请参阅 this page。请参阅Java™ Security Overview 链接的第 8 节“访问控制”。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      • 定义和注册您自己的安全管理器将允许您限制代码的作用 - 请参阅 SecurityManager 的 oracle 文档。

      • 看看java-sandbox project,它可以让您轻松创建非常灵活的沙箱来运行不受信任的代码。

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

      【讨论】:

        【解决方案4】:

        真的谢谢,我想我达到了我的目标......

        我在路径“/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!");
           }
        }
        

        我希望这是正确的方法...感谢您的帮助 托马斯

        【讨论】:

        • 不,这不是正确的方法。您已经为 jvm 中运行的所有代码提供了设置安全管理器的能力,这意味着任何上传的代码都可以轻松禁用安全性!您必须命令行上指定SecurityManager配置。
        【解决方案5】:

        感谢您的回答...我现在使用这个命令行

         java -Xmx16M -Xms2M -Xss2M -Djava.security.manager Djava.security.policy=/home/java.policy Main
        

        谢谢 汤姆

        【讨论】:

          猜你喜欢
          • 2013-03-28
          • 2018-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-19
          • 1970-01-01
          相关资源
          最近更新 更多