抛出一个消息包含违规值的异常是正确还是安全?

时间:2013-08-26 21:25:48

标签: java security validation

假设您正在编写一个通用的doSomething方法,您可以在其中检查字符串参数的有效性:

public void doSomething(String argument) {
   if(!checkArgument(argument)) {
      // Argument is not valid
      throw new IllegalArgumentException("Argument " + argument + " is not valid");
   }

   ...

抛出一个Exception,其消息可能包含可能的任意文本安全吗?或者它可以公开程序来记录伪造或其他一些安全问题吗?

有没有最佳做法来处理此类案件?

4 个答案:

答案 0 :(得分:1)

这实际上取决于抛出异常后你要做什么。 总的来说,我说这可能是一个坏主意。根据经验,你绝不应该使用"未经证实的论点。以下是一些可能会打开您的攻击情形。

  1. 这是针对网页而您正在向用户显示此错误。在这种情况下,攻击者可以执行XSS攻击等。
  2. 此错误将打印到日志中。这可能看起来很安全,但攻击者仍然可以访问您的文件系统(有限)。他们可以使用此机制来存储代码以供将来使用,或者可能损坏日志(或文件系统的其他方面)。如果将参数逐字节写入文件,则尤其如此。
  3. 此错误将存储在数据库中。这里有足够的架构信息,攻击者可能能够改变或破坏整个数据库。
  4. 它自己这可能不足以让攻击者窃取任何信息,但结合其他错误,这可以用来获取对机器的控制权。你可以做一些基本的消毒,避免大部分问题。

    1. 根据@assylias的建议执行长度检查。
    2. 确保参数中的所有字符都是字母数字(或者您希望arg中的所有内容)。
    3. 如果字母数字是限制性的,请通过任何不包含html / javascript / sql语法字符的白名单(例如'<&#;;'>' ,&#39 ;;')通常这些字符不需要出现用于调试。

答案 1 :(得分:1)

通常是安全的,但如果代码在您控制的系统(例如Web服务器)上执行,您应该决定是否允许最终用户看到异常。在异常中显示错误消息中的内部信息是Information Leakage的一种形式,因为它可以显示有关如何构建系统的信息,并且攻击者可以通过强制异常来探测漏洞。如果它是桌面应用程序,这可能不适用,因为无论如何这实际上都在用户控制之下,但是对于基于Web或互联网的任何内容都需要格外小心。

但是,您可以向自定义错误处理程序页面添加逻辑,以仅显示从MyUserExceptionClass派生的异常的详细信息,您将其作为仅在最终用户可以纠正错误时使用的策略。在这种情况下,您可能只想显示消息本身而不输出任何堆栈跟踪或其他详细信息,在这种情况下,您的异常消息应该包含参数名称的详细信息,如果它与最终用户。

为了解决deaththreetimes的答案中的要点,这些不应该与异常抛出类或异常类本身有关。使用未经过清理的数据的类应该根据输出的上下文对其进行清理。

e.g。

  1. 如果在HTML页面中输出,HTML会在输出点编码异常消息,而不是在异常抛出点。
  2. 错误记录类应将未经过处理的文本清理为正确的日志格式。如果存在字符限制或者是CSV格式的文件,则此类应确保此时消息中的任何逗号和引号字符都已正确格式化。
  3. 如果写入数据库,则由数据访问层使用参数化查询正确地将信息写入数据库。

答案 2 :(得分:1)

我完全同意SilverlightFox的回答。担心注射漏洞发生时(并确保它们不会发生)。

但是,机密性问题是例外的真正问题。在其他地方(除非我们有全局变量),我们正在处理单个图层界面上的交互。带来例外,我们有非本地问题。

例如:

  • SSN是需要严格控制的数据的典型示例。某些低级解析库可能会抛出字符串详细信息的异常。这可能会被抓到并推入日志中。通用解析代码和日志代码都不知道SSN,但他们最终引入了SSN漏洞。
  • 将异常消息放入网页的网站(有时在评论中 - 这没有帮助!)披露了可能对对手有帮助的网站实施信息。网站不应该这样做,但他们这样做。因此,您需要仔细考虑任何引发异常的代码,并且有一天可能会在Web应用程序中结束。
  • 在进程,机器或操作系统之间传播的例外情况,或其他任何情况,都可能带有机密信息。
  • 如果有移动代码,机密信息可能会降低到特权较低的代码。文件路径在这里显而易见。

值得注意的是,向异常添加可变数据是一个坏主意,因为它需要深层复制才能安全。令人遗憾的是,1.4使Throwable本身“有用”可变。

答案 3 :(得分:0)

您可以记录参数并在异常中包含子字符串。

您对安全性的关注取决于应用程序和基础架构的访问控制模型。

  1. 如果所有人都无法访问服务器,那么记录是个好主意,至少你可以查看哪个参数导致异常。
  2. 如果安全性问题较高,我建议将异常详细信息存储在数据库表中,并附带参数进行分析。
  3. 如果你想发疯,可以加密你的数据库专栏。
  4. 无论如何,我想有人想看看哪个论点导致了异常。

    干杯!!