《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

相关文章
|
1月前
|
存储 canal 算法
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
23 0
|
29天前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
24 2
|
6天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
13 1
|
6天前
|
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、第三方兼容性和提供商支持。
10 0
|
8天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
14天前
|
存储 Java 数据库连接
java使用mp持久化框架,写入5000个字符,但是VARCHAR(255) 会报错
使用Java的MyBatis Plus框架时,如果尝试将超过VARCHAR(255)限制的字符串(如5000个字符)存入数据库,会抛出异常。解决方法是将列类型改为TEXT。可通过在实体类属性上添加`@TableField(typeHandler = JdbcType.CLOB)`注解,如`private String content;`,将属性映射到CLOB类型列,以存储更长字符串。
9 0
|
22天前
|
SQL Java 数据库连接
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
11 0
|
24天前
|
存储 安全 Java
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
33 0
|
1月前
|
Java
38、Java 中的正则表达式(单字符匹配和预定义字符)
38、Java 中的正则表达式(单字符匹配和预定义字符)
18 0
|
2月前
|
存储 安全 算法
Java泛型与集合:类型安全的集合操作实践
Java泛型与集合:类型安全的集合操作实践

热门文章

最新文章