《Java安全编码标准》一2.12 IDS11-J在验证前去掉非字符码点

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

2.12 IDS11-J在验证前去掉非字符码点

在早于Unicode 5.2的版本中,条款C7允许删除非字符码点。比如,在Unicode 5.1版本的C7条款中:
条款C7 当一个进程声称不会修改一个合法编码字符序列的意思时,它不应该改变该字符编码序列,除了有可能使用标准化字符编码来取代字符序列,或是删除非字符编码之外。
根据Unicode技术报告第36号的3.5节“删除非字符编码”,在考虑Unicode的安全的时候[Davis 2008b]:
不管一个字符是否被直接删除(不是替代),例如在C7的旧版本中提及的,将会导致安全问题。这个问题是这样的:一个网关可能会对所有的敏感字符串进行处理,比如“delete”。如果传递过来的是“delXlete”。这里“X”是非字符,网关会让它通过:序列“deXlete”可能通过并无害。然而,假设在通过网关之后,一个内部进程直接删除了X。这时,就形成了一个敏感的字符序列,并且会造成安全威胁。
修改任何一个字符串,包括对非字符数据的移除或者替代,必须在对该字符串进行验证之前进行。

2.12.1 不符合规则的代码示例

这个代码示例只接受合法的ASCII字符,并且它会删除所有的非ASCII码字符。同时,它也会检查是否存在

// "\uFEFF" is a non-character code point
String s = "<scr" + "\uFEFF" + "ipt>";?
s = Normalizer.normalize(s, Form.NFKC);
// Input validation
Pattern pattern = Pattern.compile("<script>");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
??System.out.println("Found black listed tag");
} else {
??// ...?
}

// Deletes all non-valid characters?
s = s.replaceAll("^\\p{ASCII}]", "");
// s now contains "<script>"

2.12.2 符合规则的方案

这个方案使用Unicode字符序列uFFFD来替代那些未知的或者不可表示的字符。同时,这样的替代是在其他净化之前完成的,比如对

String s = "<scr" + "\uFEFF" + "ipt>";

s = Normalizer.normalize(s, Form.NFKC);
// Replaces all non-valid characters with unicode U+FFFD
s = s.replaceAll("^\\p{ASCII}]", "\uFFFD");?

Pattern pattern = Pattern.compile("<script>");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
??System.out.println("Found blacklisted tag");
} else {
??// ...?
}

根据Unicode技术报告第36号, 考虑Unicode编码的安全问题 [Davis 2008b],“U+FFFD通常是没有问题的,因为它就是设计成这样使用的。也就是说,不管是在程序开发语言,还是在结构数据中,因为不会有任何语义上的含义,通常会在解析时出现错误。当输出字符集不是Unicode编码时,这个字符可能是不存在。”

2.12.3 风险评估

将非字符编码删除会允许恶意输入绕过验证检查。
image

2.12.4 相关规范

image

2.12.5 参考书目

image

相关文章
|
6天前
|
消息中间件 安全 Java
Java版云HIS系统:实现多医院患者信息共享与安全管埋
在医疗健康领域,数据的共享与安全已经成为行业发展的重要议题。传统的医院信息系统(HIS)往往受限于单一机构的信息孤岛,无法实现跨院区、跨系统的高效协作和数据互通。然而,随着云计算技术的发展与应用,云HIS系统应运而生,它正引领着一场关于多医院患者信息共享与安全管理的重大变革。
35 6
|
17天前
|
存储 缓存 Java
|
23天前
|
JavaScript Java 测试技术
基于Java的钢铁集团公司安全管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的钢铁集团公司安全管理系统的设计与实现(源码+lw+部署文档+讲解等)
32 6
|
24天前
|
SQL 存储 安全
Java安全编码:防范常见漏洞和攻击
【4月更文挑战第18天】本文介绍了Java安全编码的最佳实践,包括防止SQL注入和XSS攻击,使用预处理语句和转义用户输入。强调了安全的密码存储、角色基础的访问控制以及防止会话劫持和CSRF攻击。此外,还提到数据保护措施,如使用HTTPS和加密敏感数据。最后,建议避免在错误处理中泄露敏感信息并记录审计日志,以提升Java应用的安全性。
|
25天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
17 1
|
25天前
|
Oracle Java 关系型数据库
Java 开发者必备:JDK 版本详解与选择策略(含安装与验证)
Oracle Java SE 支持路线图显示,JDK 8(LTS)支持至2030年,非LTS版本如9-11每6个月发布且支持有限。JDK 11(LTS)支持至2032年,而JDK 17及以上版本现在提供免费商用许可。LTS版本提供长达8年的支持,每2年发布一次。Oracle JDK与OpenJDK有多个社区和公司构建版本,如Adoptium、Amazon Corretto和Azul Zulu,它们在许可证、商业支持和更新方面有所不同。个人选择JDK时,可考虑稳定性、LTS、第三方兼容性和提供商支持。
81 0
|
27天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
1月前
|
安全 算法 Java
安全无忧:Java并发集合容器的应用与实践
安全无忧:Java并发集合容器的应用与实践
30 0
安全无忧:Java并发集合容器的应用与实践
|
1天前
|
Java
Java一分钟:线程协作:wait(), notify(), notifyAll()
【5月更文挑战第11天】本文介绍了Java多线程编程中的`wait()`, `notify()`, `notifyAll()`方法,它们用于线程间通信和同步。这些方法在`synchronized`代码块中使用,控制线程执行和资源访问。文章讨论了常见问题,如死锁、未捕获异常、同步使用错误及通知错误,并提供了生产者-消费者模型的示例代码,强调理解并正确使用这些方法对实现线程协作的重要性。
9 3
|
1天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
10 2