当前位置: 首页 > 面试题库 >

Java:我们通常不希望向用户显示错误堆栈跟踪中的哪些信息?

濮丰
2023-03-14
问题内容

我是java的新手,并且对错误堆栈跟踪引发的错误格式化并不熟悉,该错误跟踪随后被显示给我的Web应用html" target="_blank">程序的最终用户。

我对Oracle数据库的经验是,错误堆栈包含内部信息,例如模式和过程名称以及行号,这些信息虽然对调试很有用,但我希望阻止用户看到。这是一个例子:

java.sql.SQLException : ORA-20011: Error description here
ORA-07894: at "NAME_OF_SCHEMA.PROCEDURE_NAME", line 121
ORA-08932: at line 10

我要显示给用户的字符串是Error description here。我可以使用正则表达式来提取此字符串,因为我知道(1)此字符串始终位于第一行,因此我可以提取错误堆栈跟踪的第一行,并且(2)此字符串始终以Error结尾开头和结尾的线。[Oracle用户注意(我不想误导您):以上内容仅在使用RAISE_APPLICATION_ERROR且错误字符串以开头的情况下适用Error,否则文本Error不存在。

我对Java的问题是:

(1)是否有潜在的敏感内容,您不希望用户在错误堆栈中看到?如果是这样,该怎么办?例如,文件路径,服务器名称/ IP等。

(2)是否有我可以用来提取非敏感信息的Java错误堆栈跟踪的任何格式设置规则?或者,其他人如何解决这个问题?

更新1:

感谢到目前为止的所有回复,它们对您有所帮助。尽管许多人评论使用诸如getUserFriendlyMessage()将错误映射到有用的用户消息的功能,但我想知道是否有人可以扩展此映射。也就是说,对于常见错误(SQL,I
/
O等),可以使用什么“可靠”标识符来搜索此错误堆栈以标识发生的错误的类型,然后建议使用哪种相应的文本字符串?映射到此错误消息以显示给用户?@Adarshr在下面的回复是一个好的开始。例如,

Identified Expected   If found in error stack, display this friendly msg to user
-------------------   ----------------------------------------------------------
SQLException          An error occurred accessing the database. Please contact support at support@companyname.com.
IOException           Connection error(?). Please check your internet connection.

假设不需要解决与编译相关的错误,而是集中解决最终用户在正常使用过程中可能遇到的那些错误。作为参考,下面是运行时错误消息的列表:http
:
//mindprod.com/jgloss/runerrormessages.html#IOEXCEPTION

或者,是否可以仅使用堆栈跟踪的第一行显示给用户?这个链接有点像我在上面的原始问题中所得到的:

http://www3.ntu.edu.sg/home/ehchua/programming/howto/ErrorMessages.html

例如,如果Exception始终使用标识符,则只需提取介于Exception第一行和第一行结尾之间的文本即可。我不知道我们是否可以Exception一直依赖在那里。


问题答案:

您不应该向用户展示任何这种愚蠢的东西。对于大多数人来说这毫无意义,也无济于事。如您所怀疑,它还暴露了实施的内部结构,这些内部结构可能暗示恶意用户可能使用的漏洞。

相反,您应该捕获异常,将其记录下来,并向用户显示更易理解的错误消息。您可以getMessage()用来提取异常的消息部分。如果该异常没有消息,则显示诸如“没有可用的详细信息”之类的内容。

更新:

根据问题更新,我有一些评论。首先,我将使用户与系统的任何内部组件完全隔离,这既对用户友好,又出于安全考虑。(例如,即使知道您正在使用java.sql程序包,也可能向聪明的黑客暗示漏洞。)因此,在向用户显示任何内容时,请不要使用异常消息,堆栈跟踪的第一行或类似内容。

其次,您应该将所有错误从异常级别(在代码中遇到的错误)映射到用户正确html" target="_blank">抽象级别的消息。正确的方法取决于系统的内部以及引发异常时用户可能试图执行的操作。这可能意味着将您的系统分为多个层,以便每个捕获到异常的层都将其转换为更高抽象层的异常。Java异常可以包装其他异常(原因)。例如:

public boolean copyFile(File source, File destination) throws CopyException {
    try {
        // lots of code
        return true;
    } catch (IOException e) {
        throw new CopyException("File copy failed", e);
    }
}

然后可以在User类的更高级别使用它:

public boolean shareFile(File source, User otherUser) throws ShareException {
    if (otherUser.hasBlocked(this) {
        throw new ShareException("You cannot share with that user.");
    }
    try {
        return copyFile(source, otherUser.getSharedFileDestination(source));
    } catch (CopyException e) {
        throw new ShareException("Sharing failed due to an internal error", e);
    }
}

(我希望很明显,以上代码旨在说明将异常转换为更高抽象级别的想法,而不是建议您在系统中使用的代码。)

您想要处理这样的事情(而不是通过某种方式来处理消息和/或堆栈跟踪)的原因是,异常(例如,带有消息“权限被拒绝”的IOException)可能对用户(以及您的系统)。



 类似资料:
  • 我有一个ASP.NET Core3.0Web API托管在Azure应用服务上。我正在试图弄清楚为什么它会在一个控制器操作方法中抛出一个500内部服务器错误。我已经建立了应用程序洞察力,我可以在Azure Portal上的“失败”页面上看到有500个异常。但是,我看不到它们的堆栈跟踪。在Application Insights或Azure Monitor中打开堆栈跟踪报告需要做些什么吗。附注。即使

  • 在另一种情况下,经过去模糊处理后,我得到的不是正常的堆栈跟踪,而是如下所示: 是什么原因,有可能莫名其妙地从这得到一个正常的堆栈跟踪?

  • 问题内容: 大家好,我有一个使用Hibernate检索数据库中数据的Web应用程序。并且在服务器端,某些想法会定期出现。以下是异常日志。 有人可以帮我解决这个问题吗?非常感谢! 问题答案: 这是触发C3P0中此日志语句的代码: 注意: 这也不是例外,它仅用于显示调试目的的执行路径。 是的,这只是一条调试消息(实际上是中的最低级别)。 总结一下:忽略并调整您的日志记录级别以跳过这些级别。

  • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

  • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

  • 我试图在Google Play Store中调试我的应用程序的几个崩溃,但是Play Store中显示的堆栈跟踪显示的是Java文件名和行号,而不是直接引用我的Kotlin代码。我在Android Studio中查看了Java代码,但是行号不匹配。 为了查看Java代码,我转换成字节代码,然后反编译成Java。在Android Studio中还有一个更直接的选项“将Kotlin反编译为Java”,