《Java编码指南:编写安全可靠程序的75条建议》—— 指南4:确保安全敏感方法被调用时参数经过验证

简介: 当应用程序代码调用安全敏感方法时,必须验证被传递到方法中的参数。特别是,null值可能会被某些特定的安全敏感方法解读为良性参数,导致覆盖程序默认设置。尽管安全敏感方法应该是防御式编码,但是客户端代码也必须验证参数。如果不这样做,就会导致特权升级,可以执行任意代码。

本节书摘来异步社区《Java编码指南:编写安全可靠程序的75条建议》一书中的第1章,第1.4节,作者:【美】Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达), Robert C.Seacord(罗伯特 C.西科德), Dean F.Sutherland(迪恩 F.萨瑟兰), David Svoboda(大卫•斯沃博达),更多章节内容可以访问云栖社区“异步社区”公众号查看。

指南4:确保安全敏感方法被调用时参数经过验证

当应用程序代码调用安全敏感方法时,必须验证被传递到方法中的参数。特别是,null值可能会被某些特定的安全敏感方法解读为良性参数,导致覆盖程序默认设置。尽管安全敏感方法应该是防御式编码,但是客户端代码也必须验证参数。如果不这样做,就会导致特权升级,可以执行任意代码。

违规代码示例

下面的违规代码示例展示了一个双参数方法doPrivileged(),它的第二个参数是一个访问控制上下文。这段代码的功能是从以前保存的上下文中恢复特权。

AccessController.doPrivileged(
 new PrivilegedAction<Void>() {
  public Void run() {
   // ...
  }
 }, accessControlContext);```
当传入空的(null)访问控制上下文时,双参数方法doPrivileged()不能仅对之前保存的上下文进行授权。因此,当accessControlContext参数为null时,这段代码可能会导致过度授权。如果程序员打算以一个空的访问控制上下文调用AccessController.doPrivileged()方法,那么必须显式传递一个null参数或使用单参数版本的AccessController.doPrivileged()方法。

####合规解决方案
下面的合规解决方案通过确保accessControlContext不为空,阻止了程序的过度授权。

if (accessControlContext == null) {
 throw new SecurityException("Missing AccessControlContext");
}
AccessController.doPrivileged(
 new PrivilegedAction() {
  public Void run() {
   // ...
  }
 }, accessControlContext);`

适用性

必须彻底理解安全敏感方法,并验证它们的参数,以防止意想不到的参数值(如空值)导致的极端情况。如果有意想不到的参数值被传递给安全敏感方法,那么有可能会导致程序可以执行任意代码,还有可能会导致特权升级。

相关文章
|
7天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
8 0
|
27天前
|
Java
java中日期处理的一些工具方法
java中日期处理的一些工具方法
17 1
|
6天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
30 3
|
19天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
57 0
|
23天前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
22 2
|
2天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
5天前
|
Java API
编码的奇迹:Java 21引入有序集合,数据结构再进化
编码的奇迹:Java 21引入有序集合,数据结构再进化
13 0
|
5天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
5天前
|
存储 监控 安全
泛型魔法:解码Java中的类型参数
泛型魔法:解码Java中的类型参数
26 0
泛型魔法:解码Java中的类型参数
|
7天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9