可以通过 Java 异常暴露敏感信息吗?

possible to expose sensitive information via Java Exceptions?

信任边界 交叉时,是否可以通过 Java Exceptions 公开敏感的应用程序或系统信息?

我的意思是,不仅是理论上,而且如果这种情况发生在真实环境中。

例如java.io.FileNotFoundException 可能会告诉调用者我的应用程序的文件系统结构等。 java.util.ConcurrentModificationException 可能会提供有关我的应用程序的非线程安全 类 的信息。

这种情况除了下面两种,还能用其他方式处理吗?

  1. 使用 Sysouts(仅带有自定义消息)而不是 throwing exceptions 用于应该被其他人访问的代码?

  2. 如果强制抛出异常,请清理您的消息然后抛出异常

我也想知道第 2 点是否完全可以避免,并且不会有任何强制抛出异常的情况。

我的问题不是关于任何特定的应用程序,而是一般的编程实践(大型企业如两家不同的银行等需要应用程序间通信的地方)。

暴露敏感信息的最常见方式是为程序的用户(客户端)提供堆栈跟踪。

堆栈跟踪对调试问题的程序员很有用,但对其他任何人都没有用。因此,日志代码理所当然不应输出堆栈跟踪。只有当异常指示程序中存在错误时,它才应该输出它们。它应该将它们输出到程序员可以使用的地方,但尽可能少地提供给其他人。

如果程序的日志文件对程序的普通用户不可见但对管理员可见(如服务器的情况),那么这是记录堆栈跟踪的合适位置。

类似的论点也适用于其他敏感信息。

虽然您的问题完全是关于安全问题,但这也可以被视为用户体验(用户界面)问题:您向程序的不同用户提供的消息应该适合这些用户,并且应该提供他们提供对他们有用的信息,without extraneous information that could confuse them. In particular, the message text of an exception should not be reported to users(但应作为任何堆栈跟踪的一部分包含在内)。

对于client-server程序,客户端对服务器未能处理客户端发送的请求的原因的细节不感兴趣。他们需要知道请求确实失败了。如果请求失败是因为服务器的问题,而不是客户端的错误请求,他们需要知道是这种情况,以便他们可以联系管理员修复服务器。如果请求失败是因为客户端发送了错误的请求,则应告知客户端,并说明请求的错误之处,以便客户端可以发送更正的请求。

此外,请注意not all exceptions indicate a problem that some user must be told about。如果程序自动处理由异常指示的条件,在许多情况下根本不需要告诉用户异常指示的条件。