在前面,我们讨论了“敏感信息经过授权才可以使用”的这样一条有关编码安全的实践。我们还可以把这个实践扩展到更大的范围:信息和资源,需经授权,方可使用。这个信息和资源,不仅仅包括用户数据这样的敏感信息,还包括计算机代码、产品和服务。
授权使用这些资源,需要遵循“最小授权”的原则。所授予的权力,能够让应用程序完成对应的任务就行,不要授予多余的权力。为了方便,我们可以把“最小授权”这个概念拆分成如下的两个部分来理解:
最小权力的设计
其实,不管使用什么编程语言,我们编写的代码都会涉及到代码权力的设计。最常见的设计,就是代码的访问控制权限的设计。
一段代码访问应用程序接口的过程,一般需要至少两个步骤,第一步是加载类库,第二步是调用接口。这两个步骤,都需要设计好访问控制权限。
模块的访问权限
下面的例子,就是一个 Java 模块的权限设计(module-info.java)。这个权限设计,定义了一个 example.coding 模块。这个模块允许外部代码使用它提供的 com.example.coding 内部接口。
module example.coding {
exports com.example.coding;
}
这个模块可能还包含其他的接口,比如位于 com.example.implement 包内的代码。由于模块的定义没有允许外部代码使用除了 com.example.coding 包空间以外的接口,那么 com.example.implement 包内的接口,即便是 public 接口,外部代码也不能直接访问了。