《Java安全编码标准》一1.3 敏感数据泄露

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

1.3 敏感数据泄露

系统的安全策略需要确定哪些信息是敏感的。敏感数据可能包括用户信息,比如社会保障或信用卡号码、密码或私钥。在不同等级受信域的组件中共享数据的时候,我们称这些数据是跨越受信边界的。因为在Java环境中,允许在同一个程序中的处在不同受信域的两个组件进行数据通信,从而会出现那些跨受信边界的数据传输。所以,如果在域中存在一个授权用户,而该用户没有数据接收权限,那么系统必须保证这些数据不会发送给处于该域的组件。如果有可能的话,这种处理只简单地禁止数据传输,也有可能对穿越受信边界的数据进行处理,将敏感数据过滤掉,如图1-2所示。

image

在很多情况下,Java软件组件会输出敏感信息。以下规则可以帮助减轻敏感信息泄露的
image
image

在Java中,接口、类和类成员(如字段和方法)是访问受控的。这种访问受控由访问修饰符(public、private或protected)来标识,或者可以通过不使用访问控制符来标识(使用默认的访问控制,也称为package-private访问)。
Java的类型安全是指,在一个字段中被声明为private或者protected的时候,或者是在默认的保护情况下(package), 它是不允许被全局访问的。然而,有一些Java平台的设计会让这种保护失效,从而导致出现安全漏洞,比如对Java反射机制的错误使用。对于Java高手来说,这些漏洞的出现并不奇怪,因为它们在文档中都已做了详细的描述,但一不小心,还是会掉入陷阱。比如说,如果一个字段被声明为public,那么它可以被Java程序中的任意一段代码直接访问,也可以被Java程序中的任意一段代码修改(除非这个数据成员同样被声明为final)。很显然,敏感数据是不允许保存在public域中的,因为如果有人可以直接访问该程序运行所在的JVM的时候,就会招致问题。
表1-1展现了一个简化的关于访问控制规则的视图。x表示在这个地方允许特定的访问。例如,在“class”中,如果标识了x,表示在同一类中声明的代码可以访问该成员。同样,“package”一栏中,如果标识了x,那么表示,这个成员可以被任何定义在同一个包中的类(或者子类)访问,并且该成员可以在由同一个类装载器载入的类(或者子类)中定义。而同一个类加载器的条件仅适用于package-private成员访问的情况。
image

类和类成员只能给予可能的最低的访问权限,这样的话,恶意代码威胁系统安全的可能性就会大大减少。只要有可能,应当避免使用接口来开放那些包含(或调用)敏感代码的方法;接口应当只允许可以公开访问的方法,而这些方法往往是这个类公开的应用编程接口(API)的一部分。(注意,这和Bloch推荐的优先考虑API接口设计的看法相反 [Bloch 2008,Item 16])。存在一种例外情况,就是在实现一个不可修改的接口的时候,可以开放一个可变对象的公共的不可变部分(见规则OBJ04-J)。此外,值得注意的是,即使一个非final类的可见性是package-private,它仍然容易被错误使用,特别是当它包含公共方法的时候。对于那些执行了所有必要的安全检查,并对所有输入进行了净化的方法,它们同样是可以通过接口开放出来的。
对顶级类来说,protected的访问控制是无效的,虽然对嵌套类来说,可以声明它为protected。对那些非final的公共类的字段来说,它们是不能被声明为protected的,这是为了防止在另一个包中该类的子类的非受信代码可以访问该成员。此外,如果protected成员是这个类的API的一部分,则需要继续得到支持。规则OBJ01-J要求声明私有字段。
当一个类、接口、方法或者一个字段作为API的一部分进行发布的时候,比如说对网络服务接入点来说,它可以被声明为pubic。其他类和成员应当要么声明为package-private,要么声明为private。例如,如果一个类在安全性上的考虑并不是至关重要,它应该定义一个public静态工厂来实现实例控制,这可以通过使用private的构造器来实现。

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
1月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
51 4
|
19天前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
32 0
|
2月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
3月前
|
安全 Java API
java安全特性
java安全特性
30 8
|
3月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
72 11
|
3月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
116 11
|
4月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
4月前
|
Java
【Java集合类面试十二】、HashMap为什么线程不安全?
HashMap在并发环境下执行put操作可能导致循环链表的形成,进而引起死循环,因而它是线程不安全的。
|
4月前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
4月前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
52 0