Java .policy文件 - 如何防止java.util.Date()被访问

时间:2011-02-22 20:32:00

标签: java security java-ee

我正在玩java .policy文件,并且想知道如何阻止对java.util.Date()的调用,作为一个例子。

我只是想更好地了解.policy文件的工作原理以及它如何用于沙箱代码。

3 个答案:

答案 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文件中的文件删除操作。