簡體   English   中英

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

[英]How block the use of java.io.file

我正在我的 Linux 服務器上為我的學生創建一個網頁來在線編譯 Java 代碼:他們在 textarea/html 中編寫他們的代碼,然后按下一個按鈕來編譯/執行他們的程序

第一個想我想做的,它是禁止使用“java.io.file”......你有什么阻止這種訪問的技巧嗎? 我使用 jdk.8.0_60

我不知道是否有人有一些信息來提高我服務器上代碼執行的安全性......

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

有關安全性的指南,請參閱此頁面 請參閱Java™ 安全概述鏈接的第 8 節“訪問控制”。

通過使用策略文件,您可以控制允許哪些文件(如果有),但還有許多其他方面可以控制。 有關列表,請參閱策略權限鏈接。 以下是一些值得注意的:

  • FilePermission表示對文件或目錄的訪問。
  • RuntimePermission用於運行時權限,例如 prevent System.exit()
  • SocketPermission表示通過套接字訪問網絡。
  • URLPermission表示訪問由給定 URL 定義的資源的權限。

注意:即使使用安全管理器,您仍應使用操作系統文件安全保護您的服務器。

你不能真正限制 JVM 中標准庫的使用......至少不容易。

如果你想防止你的學生弄亂你的文件系統,你應該利用操作系統來做到這一點。 在僅限於特定目錄且顯然沒有sudo權限的用戶帳戶下執行代碼。

您的服務器應該已經設置為敏感數據(例如成績)不能被系統上的任何用戶訪問。

  • 定義並注冊您自己的安全管理器允許您限制的代碼做什么-請參見Oracle文檔安全管理器

  • 查看java-sandbox 項目,它允許您輕松創建非常靈活的沙箱來運行不受信任的代碼。

java-sandbox 允許安全地執行不受信任的代碼,例如來自您的應用程序中的第三方或用戶生成的代碼。 它允許指定代碼可能使用的資源和類,從而將執行與應用程序的執行環境分開。

真的謝謝,我想我達到了我的目標......

我在路徑“/home/policy”中創建了一個文件,其中包含以下幾行:grant { permission 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

謝謝湯姆

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM