我有一个模板系统,允许用户输入模板源代码并执行它们。模板源代码可以访问任意 Java 对象,包括 System、Runtime 和 IO 类。
问题是如何防止正在执行的线程调用某些方法,例如System.exit
,new FileOutputStream
等。
我有一个模板系统,允许用户输入模板源代码并执行它们。模板源代码可以访问任意 Java 对象,包括 System、Runtime 和 IO 类。
问题是如何防止正在执行的线程调用某些方法,例如System.exit
,new FileOutputStream
等。
一种(相当繁重但可行)的方法是:
System.exit
现在调用 to 将调用MySystem.exit
. 当然MySystem
不应该改造。MySystem.exit
有条件地调用。System.exit
ThreadLocal
公共类我的系统{ private static final ThreadLocal callOriginal = new ThreadLocal(); 静态公共最终无效退出(int代码){ if (Boolean.TRUE.equals (callOriginal.get ())) { System.exit(代码); } } }
ThreadLocal
为true
,其他线程设置为no
。您可能想查看类似解决方案的时间机器库源代码。
假设我们谈论的是解释器而不是生成的代码。安装SecurityManager
后,可以通过减少解释器代码权限的策略来减少权限。
如果您使用 的两个参数形式java.security.AccessController.doPrivileged
,则调用方法会检查直接调用者并忽略传递给它的任何内容(例如,AccessController.doPrivileged
)。
显然,托管不受信任的代码会暴露出巨大的攻击面。您可以通过使用在类加载器层次结构中彼此对等的类加载器来隐藏一些您自己的代码。安全属性 package.access 也很有用(尽管您仍然需要单独的类加载器)。