《Java安全编码标准》一2.10 IDS09-J如果没有指定适当的locale,不要使用locale相关方法处理与locale相关的数据

2.10 IDS09-J如果没有指定适当的locale,不要使用locale相关方法处理与locale相关的数据

当locale没有明确指定的时候,使用locale相关的方法处理与locale相关的数据会产生意想不到的后果。编程语言的标示符、协议关键字以及HTML标签通常会指定Locale.ENGLISH作为一个特定的locale。当改变默认的locale的时候,很有可能使数据绕过检查,从而改变locale相关方法的行为。比如,当把一个字符串转换为大写字符时,可认为它是合法的,然而,当把它接着转换回小写字符时,可能就会产生黑名单字符串。
任何一个程序调用locale相关方法时,如果使用非受信数据,必须显式指明使用这些方法的locale。

2.10.1 不符合规则的代码示例

这个代码示例中使用了locale相关的String.toUpperCase()?方法来将HTML标签转换为大写字符。在英文locale中,会将“title” 转换为 “TITLE”,在土耳其locale中,会将“title” 转换为 “T?TLE”,其中的“?”是拉丁文字母“I”,它在字符上是有一个点的[API 2006]。

"title".toUpperCase();

2.10.2 符合规则的方案(显式的locale)

该方案显式地将locale设置为英文,从而避免产生意想不到的问题。

"title".toUpperCase(Locale.ENGLISH);

这条规则同样适用于?String.equalsIgnoreCase()方法。

2.10.3 符合规则的方案(默认locale)

符合规则的方案在对字符串数据进行处理之前,把默认的locale设置为English。

Locale.setDefault(Locale.ENGLISH);
"title".toUpperCase();

2.10.4 风险评估

如果没有指定合适的locale,那么当使用locale相关方法处理与locale相关的数据时,会产生意外的行为。

2.10.5 参考书目

时间: 2024-08-01 23:01:20

《Java安全编码标准》一2.10 IDS09-J如果没有指定适当的locale,不要使用locale相关方法处理与locale相关的数据的相关文章

《Java安全编码标准》一导读

前 言 在Java编程语言中,关键的安全编码要素是采用良好的文档和强制的编码规范.本书提供了在Java语言中的一系列安全编码规则.这些规则的目标是消除不安全的编码实践,因为这些不安全的因素会导致可利用的漏洞.如果应用这些安全编码标准,可以帮助设计出安全的.可靠的.健壮的.有弹性的.可用性和可维护性高的高质量系统,并且这些安全编码规范还可作为评估源代码质量特性的一个指标(不管使用的是手动的还是自动化的过程).对于使用Java编程语言开发的软件系统,这个编码规范具有广泛的影响. 目 录 第1章 概述

《Java安全编码标准》一1.11 小结

1.11 小结 尽管作为一种相对安全的语言,Java语言及其类库还是在很大程度上存在着一些编程问题,从而造成系统安全漏洞.如果假设Java本身提供的功能特性可以减少一般的软件问题,并足够Java程序安全得不需要进行进一步检测,那么我们就大错特错了.因为任何在软件实现中出现的缺陷都会产生严重的安全影响,绷紧安全性这根弦是非常关键的,这样,当我们进行系统开发和部署时,就可以避免出现软件的安全漏洞问题.为了减少因为编程错误所带来的安全漏洞的可能性,Java开发人员应当遵循本编码标准中的安全编码规则,并

《Java安全编码标准》一1.5 拒绝服务

1.5 拒绝服务 拒绝服务攻击试图使计算机的资源不可获得,或者对需要使用该计算机资源的用户来说,会造成资源不足的情况.通常这种攻击是持续服务的服务器系统需要重点关注的,它与桌面应用程序有很大区别:然而,拒绝服务的问题可以出现在所有类别的应用上. 1.5.1 资源耗尽型的拒绝服务 拒绝服务可能出现在,相对于输入数据需要的资源消耗来说,使用比例上更为巨大的资源.通过客户端软件检查资源是否被过度消耗,并希望用户来处理与资源相关的问题是不合理的.但是,存在这样的客户端软件,它们可以检查那些可能会导致持久

《Java安全编码标准》一1.10 类装载器

1.10 类装载器 java.lang.ClassLoader类及其子类可以让新代码动态地加载到JVM中.每一个类都提供了装载它的ClassLoader的链接.此外,每一个类装载器类都有一个装载它的父类装载器,类装载器的顶端称为根类装载器.因为ClassLoader?被设计成抽象的,所以它不能被实例化.所有的继承自SecureClassLoader的类装载器都继承自ClassLoader.SecureClassLoader对其方法进行的权限安全检查,在它的子类中也会同样进行.SecureClas

《Java安全编码标准》一2.11 IDS10-J不要拆分两种数据结构中的字符串

2.11 IDS10-J不要拆分两种数据结构中的字符串 在历史遗留系统中,常常假设字符串中的每一个字符使用8位(一个字节,Java中的byte).而Java语言使用16位表示一个字符(Java中的Char类型).遗憾的是,不管是Java的byte类型还是char类型数据,都不能表示所有的Unicode字符.许多字符串使用例如UTF-8编码的方式存储和通信,而在这种编码中,字符长度是可变的. 当Java字符串以字符数组的方式存储时,它可以用一个字节数组来表示,字符串里的一个字符可以用两个连续的或更

《Java安全编码标准》一2.1 IDS00-J净化穿越受信边界的非受信数据

2.1 IDS00-J净化穿越受信边界的非受信数据 许多程序会接受来自未经验证的用户数据.网络连接,以及其他来自于非受信域的不可信数据,然后它们会将这些数据(经过修改或不经修改)穿过受信边界送到另一个受信域中.通常,这些数据是以字符串的形式出现的,并且它们会有既定的内部数据结构,这种数据结构必须能够被子系统所解析.同时,必须净化这些数据,因为子系统可能并不具备处理恶意输入信息的能力,这些未经净化数据输入很有可能包含注入攻击. 值得注意的是,程序必须对传递给命令行解释器或者解析器的所有字符串数据进

《Java安全编码标准》一2.3 IDS02-J在验证之前标准化路径名

2.3 IDS02-J在验证之前标准化路径名 根据Java API[API 2006]文档对java.io.File类的描述:一个路径名,不管是抽象的还是字符串形式的,可以是相对路径也可以是绝对路径.使用绝对路径名,因为在定位一个路径表示的文件时,已经不需要其他信息了,因而可以认为是完整的.相比之下,一个相对路径名必须要增加其他的路径信息才能进行解释.绝对路径名或者相对路径名会包含文件链接,比如符号(软)链接.硬链接.快捷方式.影子.别名和联名.这些文件链接在文件验证操作进行之前必须完全解析.例

《Java安全编码标准》一2.4 IDS03-J不要记录未经净化的用户输入

2.4 IDS03-J不要记录未经净化的用户输入 当日志条目包含未经净化的用户输入时会引发记录注入漏洞.恶意用户会插入伪造的日志数据,从而让系统管理员以为是系统行为 [OWASP 2008].例如,用户在将冗长的日志记录拆分成两份时,日志中使用的回车和换行符可能会被误解.记录注入攻击可以通过对任何非受信的发送到日志的输入进行净化和验证来阻止.将未经净化的用户输入写入日志同样会导致向受信边界之外泄露敏感数据,或者在存储敏感数据的时候,违反了本地的安全规则.举例来说,如果一个用户要把一个未经加密的信

《Java安全编码标准》一1.7 并发性、可见性和内存

1.7 并发性.可见性和内存 可以在不同线程之间共享的内存称为共享内存(shared memory)或内存堆(heap memory).本节使用变量(variable)这个名词来代表字段和数组元素[JLS2005].在不同的线程中共享的变量称为共享变量.所有的实例字段.静态字段以及数组元素作为共享变量存储在共享内存中.局部变量.形式方法参数以及异常例程参数是从来不能在线程之间共享的,不会受到内存模型的 影响. 在现代多处理器共享内存的架构下,每个处理器有一个或多个层次的缓存,会定期地与主存储器进