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

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

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 风险评估

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

2.4.4 相关规范

image

2.4.5 参考书目

image

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
消息中间件 安全 Java
Java版云HIS系统:实现多医院患者信息共享与安全管埋
在医疗健康领域,数据的共享与安全已经成为行业发展的重要议题。传统的医院信息系统(HIS)往往受限于单一机构的信息孤岛,无法实现跨院区、跨系统的高效协作和数据互通。然而,随着云计算技术的发展与应用,云HIS系统应运而生,它正引领着一场关于多医院患者信息共享与安全管理的重大变革。
36 6
|
25天前
|
JavaScript Java 测试技术
基于Java的钢铁集团公司安全管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的钢铁集团公司安全管理系统的设计与实现(源码+lw+部署文档+讲解等)
32 6
|
25天前
|
SQL 存储 安全
Java安全编码:防范常见漏洞和攻击
【4月更文挑战第18天】本文介绍了Java安全编码的最佳实践,包括防止SQL注入和XSS攻击,使用预处理语句和转义用户输入。强调了安全的密码存储、角色基础的访问控制以及防止会话劫持和CSRF攻击。此外,还提到数据保护措施,如使用HTTPS和加密敏感数据。最后,建议避免在错误处理中泄露敏感信息并记录审计日志,以提升Java应用的安全性。
|
26天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
18 1
|
28天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
1天前
|
Java 调度
Java一分钟之线程池:ExecutorService与Future
【5月更文挑战第12天】Java并发编程中,`ExecutorService`和`Future`是关键组件,简化多线程并提供异步执行能力。`ExecutorService`是线程池接口,用于提交任务到线程池,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。通过`submit()`提交任务并返回`Future`对象,可检查任务状态、获取结果或取消任务。注意处理`ExecutionException`和避免无限等待。实战示例展示了如何异步执行任务并获取结果。理解这些概念对提升并发性能至关重要。
16 5
|
1天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。
|
2天前
|
Java
Java一分钟:线程协作:wait(), notify(), notifyAll()
【5月更文挑战第11天】本文介绍了Java多线程编程中的`wait()`, `notify()`, `notifyAll()`方法,它们用于线程间通信和同步。这些方法在`synchronized`代码块中使用,控制线程执行和资源访问。文章讨论了常见问题,如死锁、未捕获异常、同步使用错误及通知错误,并提供了生产者-消费者模型的示例代码,强调理解并正确使用这些方法对实现线程协作的重要性。
11 3
|
2天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
54 2
|
2天前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
41 3