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

    xiaoxiao2021-04-18  142

    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字符子集,那么将会导致数据被错误解释。

    2.6.6 相关规范

    2.6.7 参考书目

    相关资源:七夕情人节表白HTML源码(两款)

    最新回复(0)