《Java安全编码标准》一3.2 DCL01-J不要重用Java标准库的已经公开的标识

简介: 本节书摘来自华章出版社《Java安全编码标准》一书中的第3章,第3.2节,作者 (美)Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.2 DCL01-J不要重用Java标准库的已经公开的标识

不要重用那些在Java标准库中已经使用过的公共的标识、公共的工具类、接口或者包。
当一个程序员使用和公开类相同的名字时,如Vector对后来的维护者来说,他可能不知道这个标识并不是指?java.util.Vector?,并且可能会无意地使用这个自定义的Vector类而不是原有的java.util.Vector类。使得这个自定义的?Vector会遮蔽java.util.Vector类,正如在JLS的6.3.2节中提到的那样。从而会导致不可预期的程序行为。
良好定义的import语句可以解决这个问题。然而,当重用的命名定义是从其他包中导入时,使用type-import-on-demand declaration(详细参见JLS的7.5.2节“Type-Import-on-Demand Declaration”[JLS 2005])会将程序员弄糊涂,因为他需要确定哪一个定义是想要的。另外,因为我们通常会使IDE来自动包括import语句,所以一种常见的操作是在编写代码后才生成这些import语句,但这种做法容易导致错误。在Java包含的import引用路径中,如果在预期的类出现之前出现了一个自定义的类,那么不会进一步搜索,这样就会毫无知觉地使用了错误的类。

3.2.1 不符合规则的代码示例(类名称)

这个不符合规则的代码实现了一个类,这个类重用了java.util.Vector 的名称。它在isEmpty()中使用了一个不同的条件判断,尝试通过重写java.util.Vector中对应的方法来达到与遗留代码接口的目的。如果维护者混淆了这个isEmpty()和java.util.Vector. isEmpty(),就会出现不可预知的行为。

class Vector {
??private int val = 1;

??public boolean isEmpty() {
????if (val == 1) {???// compares with 1 instead of 0
??????return true;
????} else {
??????return false;
????}
??}
??// other functionality is same as java.util.Vector
}

// import java.util.Vector; omitted
public class VectorUser {
??public static void main(String[] args) {
????Vector v = new Vector();
????if (v.isEmpty()) {
??????System.out.println("Vector is empty");
????}
??}
}

3.2.2 符合规则的方案(类名称)

这个符合规则的方案为这个类使用了不同的名字,防止这个类作为任何潜在的Java标准类库中的类名称的遮蔽情况出现。

class MyVector {
??// other code
}

当程序员和开发团队可以控制那些被模仿的原始类,更好的方法就是改变对它们的设计策略,这些策略可以根据Bloch的《Effective Java》[Bloch 2008]一书中第16条,更倾向于接口而不是抽象类的方法来实现。将原始类改变成接口,这可以让MyVector类得以通过声明它是我们假设的接口Vector?的实现。这可以让使用MyVector的代码与使用原始Vector实现的代码互相兼容。

3.2.3 风险评估

重用公有的标识会降低代码的可读性和可维护性。
image

自动化检测 对于重用了Java标准类库中公共类和接口的名字的问题,它们可以被自动检测工具很容易地检测到。

3.2.4 相关规范

image

3.2.5 参考书目

image

相关文章
|
1月前
|
人工智能 监控 安全
Java智慧工地(源码):数字化管理提升施工安全与质量
随着科技的发展,智慧工地已成为建筑行业转型升级的重要手段。依托智能感知设备和云物互联技术,智慧工地为工程管理带来了革命性的变革,实现了项目管理的简单化、远程化和智能化。
55 5
|
2月前
|
安全 druid Java
Java 访问数据库的奇妙之旅
本文介绍了Java访问数据库的几种常见方式
57 12
|
4月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
88 2
|
4月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
147 6
|
4月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
87 4
|
4月前
|
Java API Apache
|
5月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
472 0
在Java中处理JSON数据:Jackson与Gson库比较
|
5月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
6月前
|
安全 Java API
java安全特性
java安全特性
50 8
|
6月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
141 11