假设您正在编写一个通用的doSomething
方法,您可以在其中检查字符串参数的有效性:
public void doSomething(String argument) {
if(!checkArgument(argument)) {
// Argument is not valid
throw new IllegalArgumentException("Argument " + argument + " is not valid");
}
...
抛出一个Exception,其消息可能包含可能的任意文本安全吗?或者它可以公开程序来记录伪造或其他一些安全问题吗?
有没有最佳做法来处理此类案件?
答案 0 :(得分:1)
这实际上取决于抛出异常后你要做什么。 总的来说,我说这可能是一个坏主意。根据经验,你绝不应该使用"未经证实的论点。以下是一些可能会打开您的攻击情形。
它自己这可能不足以让攻击者窃取任何信息,但结合其他错误,这可以用来获取对机器的控制权。你可以做一些基本的消毒,避免大部分问题。
答案 1 :(得分:1)
通常是安全的,但如果代码在您控制的系统(例如Web服务器)上执行,您应该决定是否允许最终用户看到异常。在异常中显示错误消息中的内部信息是Information Leakage的一种形式,因为它可以显示有关如何构建系统的信息,并且攻击者可以通过强制异常来探测漏洞。如果它是桌面应用程序,这可能不适用,因为无论如何这实际上都在用户控制之下,但是对于基于Web或互联网的任何内容都需要格外小心。
但是,您可以向自定义错误处理程序页面添加逻辑,以仅显示从MyUserExceptionClass
派生的异常的详细信息,您将其作为仅在最终用户可以纠正错误时使用的策略。在这种情况下,您可能只想显示消息本身而不输出任何堆栈跟踪或其他详细信息,在这种情况下,您的异常消息应该包含参数名称的详细信息,如果它与最终用户。
为了解决deaththreetimes的答案中的要点,这些不应该与异常抛出类或异常类本身有关。使用未经过清理的数据的类应该根据输出的上下文对其进行清理。
e.g。
答案 2 :(得分:1)
我完全同意SilverlightFox的回答。担心注射漏洞发生时(并确保它们不会发生)。
但是,机密性问题是例外的真正问题。在其他地方(除非我们有全局变量),我们正在处理单个图层界面上的交互。带来例外,我们有非本地问题。
例如:
值得注意的是,向异常添加可变数据是一个坏主意,因为它需要深层复制才能安全。令人遗憾的是,1.4使Throwable
本身“有用”可变。
答案 3 :(得分:0)
您可以记录参数并在异常中包含子字符串。
您对安全性的关注取决于应用程序和基础架构的访问控制模型。
无论如何,我想有人想看看哪个论点导致了异常。
干杯!!