《Java安全编码标准》一2.7 IDS06-J从格式字符串中排除用户输入

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

2.7 IDS06-J从格式字符串中排除用户输入

对Java格式字符串的解释要比对在像C语言这样的语言中更严格[Seacord 2005]。当任何转换参数不能匹配相应的格式符时,标准类库实现会抛出一个相应的异常。这种方法降低了被恶意利用的可能性。然而,恶意用户输入可以利用格式字符串,并且造成信息泄露或者拒绝服务。因此,不能在格式字符串中使用非受信来源的字符串。

2.7.1 不符合规则的代码示例

这个不符合规则的代码示例展示了可能出现信息泄露的问题。它将信用卡的失效日期作为输入参数并将其用在格式字符串中。

class Format {
??static Calendar c =
???new GregorianCalendar(1995, GregorianCalendar.MAY, 23);
??public static void main(String[] args) {??
????// args[0] is the credit card expiration date
????// args[0] can contain either %1$tm, %1$te or %1$tY as malicious
????// arguments
????// First argument prints 05 (May), second prints 23 (day)?
????// and third prints 1995 (year)
????// Perform comparison with c, if it doesn’t match print the?
????// following line
????System.out.printf(args[0] +?
????" did not match! HINT: It was issued on %1$terd of some month", c);
??}
}
AI 代码解读

如果没有经过正确输入验证,攻击者通过在输入语句中包含以下参数之一:%1tm?te或?%1$tY,就可以判断验证中所用来和输入相对比的日期。

2.7.2 符合规则的方案

该方案能够保证用户产生的输入会被排除在格式字符串之外。

class Format {
??static Calendar c =?
????new GregorianCalendar(1995, GregorianCalendar.MAY, 23);
??public static void main(String[] args) {??
????// args[0] is the credit card expiration date
????// Perform comparison with c,?
????// if it doesn't match print the following line
????System.out.printf ("%s did not match! "
????????+ " HINT: It was issued on %1$terd of some month", args[0], c);
??}
}
AI 代码解读

2.7.3 风险评估

image

自动化检测 完成污染分析的静态分析工具可以用来判断是否违背该规则。

2.7.4 相关规范

image

2.7.5 参考书目

image

目录
打赏
0
0
0
0
1408
分享
相关文章
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
52 17
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
43 13
|
4月前
|
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
182 83
Java智慧工地(源码):数字化管理提升施工安全与质量
随着科技的发展,智慧工地已成为建筑行业转型升级的重要手段。依托智能感知设备和云物互联技术,智慧工地为工程管理带来了革命性的变革,实现了项目管理的简单化、远程化和智能化。
55 5
|
4月前
|
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
92 26
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
143 8
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
88 2
|
4月前
|
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
117 0
Java安全管理器
总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。
1379 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等