background image

有时需要在全局防止包被不可信任代码访问,本节描述了一些防护技术:
•        防止包注入:如果不可信任代码想要访问类的包保护成员,可以尝试在被攻击的
包内定义自己的新类用以获取这些成员的访问权。防止这类攻击的方式有两种:
1.        通过向 java.security.properties 文件中加入如下文字防止包内被注入恶意类。
          ... 
package.definition=Package#1 [,Package#2,...,Package#n]

...

这会导致当试图在包内定义新类时类装载器的 defineClass 方法会抛出异常,除非赋予
代码一下权限:
... 
RuntimePermission("defineClassInPackage."+package)

...

2.        另一种方式是通过将包内的类加入到封装的 Jar 文件里。
        通过使用这种技巧,代码无法获得扩展包的权限,因此也无须修改
java.security.properties 文件。
•        防止包访问:通过限制包访问并仅赋予特定代码访问权限防止不可信任代码对包
成员的访问。通过向 java.security.properties 文件中加入如下文字可以达到这一目的:
      ... 
package.access=Package#1 [,Package#2,...,Package#n]

...

这会导致当试图在包内定义新类时类装载器的 defineClass 方法会抛出异常,除非赋予
代码一下权限:
... 
RuntimePermission("defineClassInPackage."+package)

...

如果可能使对象不可改变
如果可能,使对象不可改变。如果不可能,使得它们可以被克隆并返回一个副本。如果返
回的对象是数组、向量或哈希表等,牢记这些对象不能被改变,调用者修改这些对象的内
容可能导致安全漏洞。此外,因为不用上锁,不可改变性能够提高并发性。参考 Clear 
sensitive information 了解该惯例的例外情况。

不要返回指向包含敏感数据的内部数组的引用
该惯例仅仅是不可变惯例的变型,在这儿提出是因为常常在这里犯错。即使数组中包含不