《数据结构与抽象:Java语言描述(原书第4版)》一2.1.4 让实现安全

简介:

本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第2章 ,第2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 罗得岛大学  新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.1.4 让实现安全

鉴于当今黑客及对重要软件系统未经授权入侵的现实情况,程序员必须在代码中添加安全措施,以使程序对使用者是安全的。虽然Java为你管理内存,检查数组下标的合法性,且是类型安全的,但一个错误会使你的代码易受攻击。实现ADT时应该时刻铭记安全性,尽管在已有的代码中增加安全机制可能是困难的。

注:你可以在程序中检查可能出现的错误来练习有安全机制的程序设计(fail-safe programming)。安全可靠程序设计(safe and secure programming)通过验证输入给方法的数据和参数的合法性,消除方法的副作用,对客户和使用者的行为不做任何假设,来扩展有安全机制的程序设计的概念。
安全说明:保护ADT实现的完整性
当实现一个ADT时,必须问自己的两个问题是

  • 如果构造方法没有完全执行,那么可能会发生什么?例如,构造方法可能在完成初始化之前就抛出一个异常或错误。但是入侵者可能捕获异常或错误,并试图使用部分初始化的对象。
  • 如果客户试图创建一个其容量超出给定范围的包,那么可能会发生什么?
    如果这两个动作可能导致问题,则我们必须阻止它们。

对于类ArrayBag,我们想防范前面安全说明中所描述的两种情形。现在开始细化ArrayBag的不完整的实现,在类中增加下列两个数据域,以使代码更安全:
image

这两个修改都涉及构造方法。因为默认的构造方法调用带参数的构造方法,所以仅修改后者就足够了。为确保客户不能创建太大的包,构造方法应该检查客户所需包的容量与MAX_CAPACITY值。如果需要的容量太大,则构造方法可以抛出一个异常。
如果所需的容量处在允许范围内,则ArrayBag的构造方法为什么还不能正确完成呢?因为内存不足可能导致分配数组失败。这样一个事件会导致错误OutOfMemoryError。一般地,客户将这个错误看作致命事件。黑客可能捕获这个错误(就像你捕获异常一样),并试图使用部分初始化的对象。为防止这种情况,类的每个重要方法在执行其操作之前都可以检查域initialized的状态。这样,畸形对象就不会再有动作。对于正确初始化的对象,构造方法将把域initialized置为真。
下面是修改后的构造方法。
image

注意,构造方法在成功完成其他任务后,最后一个动作是将initialized赋值为真。还应注意,IllegalStateException是标准运行时异常。
下面来看看如何使用initialized。
在数组bag已成功分配的基础上,ArrayBag中的任何公有方法在继续执行之前都应该确保数据域initialized的值为真。如果initialized为假,这样的方法可以抛出一个异常。例如,可以如下所示修改方法add。
image
image

注:异常SecurityException和IllegalStateException都是包java.lang中的标准运行时异常。因此,不需要import语句。

因为我们将在多个方法中检查initialized,所以为避免代码重复定义下列私有方法。
image

方法add可以修改为:
image

应该以相同的方式修改核心方法toArray,因为它用到了ArrayBag的数据域bag。

安全说明:你所熟知的编写Java代码的某些常见准则,实际上增加了代码的安全性。这些准则是:

  • 将类的大多数数据域声明为私有的,如果不是全部。任何公有数据域都应该是静态和终态的,且有常量值。
  • 避免那些掩盖代码安全性的所谓聪明的逻辑。
  • 避免重复代码。相反,将这样的代码封装为一个可供其他方法调用的私有方法。
  • 当构造方法调用一个方法时,确保这个方法不能被重写。

安全说明:终态类。注意,我们将ArrayBag声明为一个终态类。因此,不会有从ArrayBag派生的其他类,即ArrayBag不能是另一个类的父类或基类。终态类比非终态类更安全,因为程序员不能使用继承来改变它的行为。稍后我们将细化这个方法,定义终态方法而不是整个类。

相关文章
|
23天前
|
存储 算法 Java
Java数据结构与算法-java数据结构与算法(二)
Java数据结构与算法-java数据结构与算法
66 1
|
24天前
|
数据采集 分布式计算 大数据
Java语言在大数据处理中的应用
传统的大数据处理往往依赖于庞大的数据中心和高性能的服务器,然而随着大数据时代的到来,Java作为一种强大的编程语言正在被广泛应用于大数据处理领域。本文将探讨Java语言在大数据处理中的优势和应用,以及其在分布式计算、数据处理和系统集成等方面的重要作用。
|
1天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
1天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
27 10
|
2天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
10 1
|
4天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
6天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
7天前
|
Java API
编码的奇迹:Java 21引入有序集合,数据结构再进化
编码的奇迹:Java 21引入有序集合,数据结构再进化
14 0
|
17天前
|
Java
Java语言打印九九乘法表(详解)
Java语言打印九九乘法表(详解)
15 1
Java语言打印九九乘法表(详解)
|
21天前
|
存储 安全 Java
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
33 0