《Java安全编码标准》一2.6 IDS05-J使用ASCII字符集的子集作为文件名和路径名

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

2.6 IDS05-J使用ASCII字符集的子集作为文件名和路径名

如果文件名和路径名中包含了特殊字符,就会有问题,并且它会引起不可预期的系统行为,从而导致安全漏洞。在构建文件名或者路径名的时候,下面的字符和模式是有问题的。
以破折号开头:当调用一个程序时,使用的是它的文件名,若文件名以破折号开头,那么会导致问题,因为这样的文件名的第一个字符会被解析为选项标志。
控制字符,例如换行符、回车与Esc:在执行shell脚本和记录日志的时候,如果在文件名中采用控制字符,那么可能会导致意想不到的问题。
空格:脚本中的空格会导致问题,在没用双引号包围文件名的时候空格也会引发问题。
不合法的字符编码:字符编码会使正常验证文件名和路径名变得困难(参见规则IDS11-J)。
命名空间分隔符:文件名和路径名中包括了命名空间分隔符,会引起潜在的安全问题和不可预期的后果。
命令行解释器、脚本和解析器:某些字符对于命令行解释器、shell或者解析器来说,是有特殊含义的。应该避免使用它们。
受MS-DOS的影响,文件名一般采用xxxxxxxx.xxx的形式,这里x代表字母数字字符。这种方式受到现代系统的广泛支持。在某些平台上,文件名是大小写敏感的,而在其他平台上,文件名是大小写不敏感的。 VU#439395是一个在C语言中存在安全漏洞的例子,在这个例子中,因为没有正确处理大小写敏感而产生了问题[VU#439395]。
这条规则是规则IDS00-J的特例。

2.6.1 不符合规则的代码示例

在以下不符合规则的代码示例中,使用了不安全的字符作为文件名的一部分。

File f = new File("A\uD8AB");
OutputStream out = new FileOutputStream(f);

一个平台可以自由地定义它自己的不安全字符的映射集合。比如,当在Ubuntu Linux系统中测试时,这种不合规的代码例子会产生以下的文件名:
A?

2.6.2 符合规则的方案

使用一个描述性的文件名,并且该文件名只使用ASCII字符集的子集。

File f = new File("name.ext");
OutputStream out = new FileOutputStream(f);

2.6.3 不符合规则的代码示例

这个不符合规则的代码示例创建了一个文件,其中使用了未经净化的用户输入。

public static void main(String[] args) throws Exception {
??if (args.length < 1) {
????// handle error
??}
??File f = new File(args[0]);
??OutputStream out = new FileOutputStream(f);
??// ...
}

该文件名没有经过任何检查来防止使用问题字符,当攻击者正好知道这段程序代码用来创建或重命名文件,而这些文件以后会用于脚本或某些自动化过程的话,他可以选择特殊的字符作为输出文件夹名,从而恶意迷惑后续过程。

2.6.4 符合规则的方案

在这个符合规则的方案中,程序使用了白名单,从而拒绝了不安全的文件名。

public static void main(String[] args) throws Exception {
??if (args.length < 1) {
????// handle error
??}
??String filename = args[0];

??Pattern pattern = Pattern.compile("[^A-Za-z0-9%&+,.:=_]");
??Matcher matcher = pattern.matcher(filename);
??if (matcher.find()) {
????// filename contains bad chars, handle error
??}
??File f = new File(filename);
??OutputStream out = new FileOutputStream(f);
??// ...
}

所有来自于非受信源的文件名必须经过净化,以保证它们只含有安全的字符。

2.6.5 风险评估

如果没有使用安全的ASCII字符子集,那么将会导致数据被错误解释。
image

2.6.6 相关规范

image

2.6.7 参考书目

image
image

相关文章
|
2月前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
122 60
|
16天前
|
运维 Cloud Native Java
postman发起post请求遇到报错:java.io.FileNotFoundException (文件名、目录名或卷标语法不正确。)
遇到bug报错,多猜可能的原因,控制变量反复测试,直至找到问题的关键,然后再思考如何解决或者回避。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来
|
1月前
|
人工智能 监控 安全
Java智慧工地(源码):数字化管理提升施工安全与质量
随着科技的发展,智慧工地已成为建筑行业转型升级的重要手段。依托智能感知设备和云物互联技术,智慧工地为工程管理带来了革命性的变革,实现了项目管理的简单化、远程化和智能化。
55 5
|
4月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
88 2
|
4月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
87 4
|
5月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
6月前
|
安全 Java API
java安全特性
java安全特性
50 8
|
6月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
141 11
|
1月前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
172 60
【Java并发】【线程池】带你从0-1入门线程池