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

2.4 IDS03-J不要记录未经净化的用户输入

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

2.4.1 不符合规则的代码示例

从这个不符合规则的代码示例中,可以看到在接收到非法请求的时候,会记录用户的用户名。这时没有执行任何输入净化。

if (loginSuccessful) {
??logger.severe("User login succeeded for: " + username);
} else {
??logger.severe("User login failed for: " + username);
}

如果没有净化,那么可能会出现日志注入攻击。当出现username是david时,标准的日志信息如下所示:

May 15, 2011 2:19:10 PM java.util.logging.LogManager$RootLogger log
SEVERE: User login failed for: david

如果日志信息中使用的username不是david而是多行字符串,如下所示:
david

May 15, 2011 2:25:52 PM java.util.logging.LogManager$RootLogger log
SEVERE: User login succeeded for: administrator

那么日志中包含了以下可能引起误导的信息:

May 15, 2011 2:19:10 PM java.util.logging.LogManager$RootLogger log
SEVERE: User login failed for: david
May 15, 2011 2:25:52 PM java.util.logging.LogManager$RootLogger log
SEVERE: User login succeeded for: administrator

2.4.2 符合规则的方案

这个符合规则的方案在登录之前会净化用户名输入,从而防止注入攻击。具体的输入处理的更多细节请参考规则IDS00-J。

if (!Pattern.matches("[A-Za-z0-9_]+", username)) {
??// Unsanitized username
??logger.severe("User login failed for unauthorized user");
} else if (loginSuccessful) {
??logger.severe("User login succeeded for: " + username);
} else {
??logger.severe("User login failed for: " + username);
}

2.4.3 风险评估

允许日志记录未经验证的用户输入,会导致错误的日志信息,从而泄露安全信息,或者会保存敏感信息,但这种保存方式是不合规则的。

2.4.4 相关规范

2.4.5 参考书目

时间: 2024-09-20 16:34:49

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

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

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

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

2.6 IDS05-J使用ASCII字符集的子集作为文件名和路径名 如果文件名和路径名中包含了特殊字符,就会有问题,并且它会引起不可预期的系统行为,从而导致安全漏洞.在构建文件名或者路径名的时候,下面的字符和模式是有问题的. 以破折号开头:当调用一个程序时,使用的是它的文件名,若文件名以破折号开头,那么会导致问题,因为这样的文件名的第一个字符会被解析为选项标志. 控制字符,例如换行符.回车与Esc:在执行shell脚本和记录日志的时候,如果在文件名中采用控制字符,那么可能会导致意想不到的问题.

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

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

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

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

《Java安全编码标准》一2.7 IDS06-J从格式字符串中排除用户输入

2.7 IDS06-J从格式字符串中排除用户输入 对Java格式字符串的解释要比对在像C语言这样的语言中更严格[Seacord 2005].当任何转换参数不能匹配相应的格式符时,标准类库实现会抛出一个相应的异常.这种方法降低了被恶意利用的可能性.然而,恶意用户输入可以利用格式字符串,并且造成信息泄露或者拒绝服务.因此,不能在格式字符串中使用非受信来源的字符串. 2.7.1 不符合规则的代码示例 这个不符合规则的代码示例展示了可能出现信息泄露的问题.它将信用卡的失效日期作为输入参数并将其用在格式字

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

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

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

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

《Java安全编码标准》一2.8 IDS07-J不要向Runtime.exec()?方法传递非受信、未净化的数据

2.8 IDS07-J不要向Runtime.exec()?方法传递非受信.未净化的数据 外部程序通常被系统调用来完成某种需要的功能.这是一种重用的形式,也被认为是一种简单基于组件的软件工程方法.在应用没有净化非受信的输入并且在执行外部程序时使用这种数据,就会导致产生命令和参数注入漏洞. 每一个Java应用都有一个唯一的Runtime类的实例,通过它可以提供一个应用和应用运行环境的接口.当前的Runtime对象可以通过Runtime.getRuntime()方法获得.Runtime.getRunt

《Java安全编码标准》一1.2 注入攻击

1.2 注入攻击 当一个组件从超出该组件受信边界的外部数据源接收数据的时候,这些数据可能是恶意的,并且会导致注入攻击,如图1-1所示. 程序必须采取以下几个步骤,从而通过受信边界而收到的数据确保是适当的并且是没有恶意的.这些步骤包括: 验证(Validation):验证是指这样一个过程,该过程可以保证输入的数据处在预先设定好的有效的程序输入范围之内.这就要求这些输入符合类型和数值范围的要求,并且对各个类别和子系统来说,输入不会发生变化. 净化(Sanitization):在许多情况下,数据是从另