我正在玩java .policy文件,并且想知道如何阻止对java.util.Date()的调用,作为一个例子。
我只是想更好地了解.policy文件的工作原理以及它如何用于沙箱代码。
答案 0 :(得分:3)
我害怕你会不幸。
正如PaŭloEbermann所说,package.access
可以阻止包层次结构。您可以使用自定义SecurityManager
更准确地了解这一点,这通常是一个很好的迹象表明您正在做一些非常狡猾的事情。
通常,您可以创建一个并非总是委托给其父级的ClassLoader
。技术上反对当前的Java SE规范,尽管Java EE规范鼓励它。你可以阻止java.util.Date
。如果任何其他类引用它,它仍然可以通过反射访问,或者你可以获得它的实例。您可以阻止Date
使用的传递关闭,包括以某种方式返回Date
的那些。但是,要使用最小日期完成方案,您必须在类加载器中加载java.util.Date
,而不能将其与所有其他java.*
类一起加载。
所以,错误,替换rt.jar中的java.util.Date
类(可能使用Java代理),并在任何不希望用new Date()
限制new Date(System.currentTimeMillis())
的类中替换
(顺便说一句,+1可减少对System.currentTimeMillis()
及其他魔术方法的依赖。)
答案 1 :(得分:2)
要限制对某些软件包的访问,您实际上不是要更改.policy
文件,而是更改security.properties
。有一个条目package.access=...
,列出了需要RuntimePermissions的软件包。因此,您不能专门限制对单个类的访问,仅限于整个包(包括子包,如果需要),即java.util
。
(您也可以通过Security.?etProperty
方法访问它。)
如果你这样做了,你以后可以在策略中添加正确的RuntimePermission,让“好”的代码使用它。
如果你限制对java.util的访问,我认为JRE的很大一部分会停止工作,所以最好再尝试另一个类进行测试。
答案 2 :(得分:1)
沙箱主要工作的方式是从类中执行安全敏感操作的调用到当前的SecurityManager以检查这样的调用是否应该成功。由于Date类不被认为是安全敏感的,因此它的代码中不存在这样的调用,这就是为什么 - 正如Tom和Paulo所解释的那样 - 很难限制它。
例如,相比之下:文件操作被认为是安全敏感的,这就是File类调用SecurityManager的原因。作为示例,删除方法:
public boolean delete() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkDelete(path);
}
return fs.delete(this);
}
由于SecurityManager检查File类,您可以更轻松地限制.policy文件中的文件删除操作。