《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);
??}
}

如果没有经过正确输入验证,攻击者通过在输入语句中包含以下参数之一:%1$tm、?%1$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);
??}
}

2.7.3 风险评估

image

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

2.7.4 相关规范

image

2.7.5 参考书目

image

相关文章
|
17天前
|
Java
Java 字符串分割split空字符串丢失解决方案
Java 字符串分割split空字符串丢失解决方案
|
9天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
15 1
|
11天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
19天前
|
Java
Java练习题-键盘录入字符串实现大小写转换
Java练习题-键盘录入字符串实现大小写转换
20 2
|
20天前
|
存储 安全 Java
Java中实现高效的字符串拼接技术
【4月更文挑战第6天】在Java编程中,字符串拼接是一个常见的操作。然而,由于字符串的不可变性,频繁的拼接操作可能会导致性能问题。本文将探讨Java中实现高效字符串拼接的技术,包括使用StringBuilder类、StringBuffer类以及Java 8中的StringJoiner类。通过对比这些技术的优缺点,我们将为您提供在不同场景下选择合适的字符串拼接方法的建议。
|
23天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
28天前
|
Java
java 8 数组转字符串并以逗号分隔
java 8 数组转字符串并以逗号分隔
11 0
|
28天前
|
存储 安全 Java
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
36 0
|
3天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
21 0
|
1天前
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度