我有一個模板系統允許用戶輸入模板源代碼並執行它們。模板源代碼可以訪問任何Java對象,包括System,Runtime和IO類。防止線程執行某些方法
的問題是如何防止執行線程與調用某些方法,如System.exit
,new FileOutputStream
等
我有一個模板系統允許用戶輸入模板源代碼並執行它們。模板源代碼可以訪問任何Java對象,包括System,Runtime和IO類。防止線程執行某些方法
的問題是如何防止執行線程與調用某些方法,如System.exit
,new FileOutputStream
等
一(頗重,但可行)的方式來做到這一點是這樣的:
System.exit
現在將調用MySystem.exit
。當然MySystem
不應該被轉換。MySystem.exit
的代碼可以有條件地基於例如System.exit
來調用。在ThreadLocal
變量上。public class MySystem { private static final ThreadLocal callOriginal = new ThreadLocal(); static public final void exit (int code) { if (Boolean.TRUE.equals (callOriginal.get())) { System.exit (code); } } }
ThreadLocal
到true
,爲他人no
。您可能需要查看time-machine類似解決方案的庫源代碼。
假設我們正在談論解釋器而不是生成的代碼。通過安裝SecurityManager
,可以通過降低解釋器代碼權限的策略來降低權限。
如果使用java.security.AccessController.doPrivileged
的雙參數形式,那麼調用方法會檢查直接調用者並忽略任何通過該調用方法的問題(例如,AccessController.doPrivileged
)。
明顯託管不受信任的代碼會暴露一個巨大的攻擊面。您可以使用類加載器來隱藏自己的一些代碼,這些類加載器在類加載器層次結構中是彼此對等的。安全屬性package.access也很有用(儘管你仍然需要單獨的類加載器)。
嗨,感謝您的輸入。你可以給我一些鏈接,以幫助我更好地理解如何在本文中建議使用ClassLoader實現SecurityManager? –
您是否考慮過使用[SecurityManager](http://docs.oracle.com/javase/tutorial/essential/environment/security.html)? – assylias
我不認爲'SecurityManager'可以阻止應用程序使用'System.exit()'。目的不是爲了保護應用程序本身,而是針對應用程序的系統。@green具有有限功能集的Java解釋器或某種類型的源代碼預處理器,用好的東西代替壞的方法 – zapl
您可能需要面向方面的編程框架。我不太瞭解他們,但我認爲他們可以讓您將自定義安全策略添加到任何對象。 – didierc