Skip to content

摘要

不指定Locale而直接调用toUpperCase()toLowerCase()进行相等比较,可能引发不可预见的输出,甚至可能规避自定义验证流程。

缺陷描述

为确保数据的准确比较,特别是在涉及Locale设置依赖性的情况下,必须明确指定适当的Locale设置。 以下示例致力于实施验证机制,旨在精准识别用户输入中是否包含有<script>标签。

示例1

md
public String tagProcessor(String tag){
if (tag.toUpperCase().equals("SCRIPT")){
return null;
}
//does not contain SCRIPT tag, keep processing input
...
}

示例1中java.lang.String.toUpperCase() 方法在缺乏特定locale设置时,将遵循默认的locale规则来进行大小写转换。使用土耳其语言环境"title". touppercase()返回" T\u0130TLE",其中"\u0130"是" LATINCAPITAL LETTER I WITH DOT ABOVE" 字符。这可能会导致意外结果,例如在示例1中,这将防止“script”这个词被验证捕获,从而可能导致跨站脚本漏洞。

修复建议

为确保万无一失,务必指定默认locale,或利用支持locale的API(如toUpperCase())来明确指定所需的语言环境。

以下示例将locale人工指定为toUpperCase()的参数。

示例2

md
import java.util.Locale;
...
public String tagProcessor(String tag){
if (tag.toUpperCase(Locale.ENGLISH).equals("SCRIPT")){
return null;
}
//does not contain SCRIPT tag, keep processing input
...
}

基于MIT协议发布.