1.4 效能泄露
效能(capability)指的是在授权中可以进行沟通而不会被忘记的标识。效能这个词是由Dennis和Van Horn[Dennis 1966]引入的。它指向的是一个数值,这个数值指向的对象拥有一系列的对象访问权限。在一个基于效能的操作系统中的用户程序,必须使用效能来访问对象。
每一个Java对象都有不会被遗忘的标识。因为Java的==操作符会对引用等进行测试,它会被用来测试这个标识。因为有这个不会被遗忘的标识,所以允许使用一个对象引用作为标记,从而作为某种形式的动作需要的授权的一个不会被遗忘的证据[Mettler 2010a]。
授权会包含在对象引用中,这些对象引用被作为效能来使用。授权指那些运行代码带来的任何效果,而这些运行代码也许会带来其他的副作用。授权不仅包括那些对于外部资源例如文件或者网络套接字的操作,而且包含了那些在程序不同部分进行共享的可变数据结构的操作[Mettler 2010b]。
对于那些方法会执行敏感操作的对象的引用而言,它们会允许持有者执行这些操作的效能(或者要求一个对象代表这些持有者执行这些操作)。所以,这样的引用自身必须要被视为敏感数据,并且不能泄露给非受信代码。
一个很有可能让人感到惊讶的泄露效能和数据的源头是内隐类,这些类可以访问它们包含的类的所有字段。Java字节码缺少内置的对内隐类的支持,因此,内隐类必须编译成带有样式名称的普通类,如OuterClass$InnerClasss。因为内隐类必须能访问它们的包含类的私有字段,所以对这些字段的访问控制,就被转换到对字节码中的包的访问来进行。因而,手写的字节码可以访问这些名义上的私有字段(请以“Java字节码工程的安全方面”[Schonefeld2002]作为例子进行参考)。
以下是考虑效能的规则: