堆栈跟踪是否应该出现在向用户显示的错误消息中?


45

我在工作场所有些争论,我试图弄清楚谁是正确的,以及正确的做法是什么。

上下文:我们的客户用于会计和其他ERP内容的Intranet Web应用程序。

我认为向用户显示的错误消息(当事情崩溃时)应该包括尽可能多的信息,包括堆栈跟踪。当然,它必须以友好的大写字母“ N发生错误,请向开发人员提交以下信息”开头。

我的理由是,崩溃的应用程序的屏幕快照通常将是唯一容易获得的信息源。当然,您可以尝试与客户的系统管理员联系,尝试解释您的日志文件在何处,等等,但这可能会很缓慢且令人痛苦(与客户代表进行交流的大部分时间是这样)。

另外,拥有即时和完整的信息在开发中非常有用,在开发中,您不必遍历日志文件即可查找每个异常所需的内容。(但这可以通过配置开关解决。)

不幸的是,已经进行了某种形式的“安全审核”(不知道他们是如何在没有来源的情况下执行此操作的……但是无论如何),并且他们抱怨完整的异常消息将其视为安全威胁。当然,客户(至少是我所知道的)已经从表面上看待了这一点,现在要求清除消息。

我看不到潜在的攻击者如何使用堆栈跟踪来找出他以前无法理解的任何东西。是否有任何例子,有记录的证明有人这样做吗?我认为我们应该与这个愚蠢的想法作斗争,但也许我是这里的傻瓜,所以...

谁是对的?


25
哇。只是...哇。” Unfortunately there has been some kind of "Security audit"“-认真吗?那是什么样的态度?安全审核对有利-使您的系统更好,并在坏人发现之前发现问题。您应该真正考虑与他们合作,而不是反对他们。另外,您可以尝试在Information Security上获取有关安全PoV的更多信息。
AviD 2012年

7
顺便说一句,安全审核不一定需要访问源代码,他们可能进行了黑盒渗透测试,以模拟恶意用户的行为-尝试以用户身份攻击应用程序。尽管我同意访问源代码可以启用一种更有效的审核形式。:-)
AviD 2012年

1
@AviD-实际上,我不知道他们分析了什么,但是从某些报告中,我看到这对我来说似乎是一个黑盒测试。老实说,我不想与他们对抗。的确,当我听到这些消息时,我确实喜欢它。但是他们的这种特殊的“脆弱性”对我来说似乎很愚蠢。在每个安全决策中,您都必须权衡减少威胁与减少可用性。在这种情况下,我认为它降低可用性远不止提高安全性。
Vilx-

1
我对称重非常同意,但对它的应用却不同意。它对安全性的危害比您想象的要严重得多,而且我还认为,您的方式(在我与某些用户交谈之前,也自己做过……)对可用性而言更糟。用面向任务的术语来思考-正如@Jon的回答所说,他的方式可以使用户的工作做得更好。用户不需要关心堆栈(除非您的用户是开发人员...)但是,我的专业知识是安全性-风险是真实的。
AviD 2012年

1
@AviD-也许您可以向我介绍一些资源,这些资源可以说明堆栈跟踪可能是多么危险?我已经准备好接受这一点,但是我想要的不仅仅是“只显示您需要的内容”的一般原则。
Vilx-

Answers:


73

我倾向于在数据库或文件中构建应用程序日志,并将所有此类信息记录到该日志中。然后,您可以为用户提供一个错误号,该错误号可标识该错误与哪个日志项相关,因此可以将其找回。这种模式也很有用,因为即使用户不费吹灰之力也可以跟踪错误,因此您可以更好地了解问题出在哪里。

如果您的站点安装在客户端环境中而您无法访问,则可以获取现场IT部门,根据错误编号向您发送一些摘录。

您可能要考虑的另一件事是让系统将错误的详细信息通过电子邮件发送给您可以看到的邮箱,这样您就可以知道出现问题的时间。

从根本上说,有一个系统在某些不正确的情况下会冒失,这不会激发人们对非技术用户的信心-它会吓them他们,使他们认为某些事情是非常错误的(例如,您了解多少BSOD,以及如何做)你觉得什么时候来)?

在stacktrace上:

在.Net中,堆栈跟踪将显示对MS核心组件的完整跟踪,并显示有关您所使用的技术以及可能的版本的详细信息。这为入侵者提供了有关可能被利用的弱点的有价值的信息。


6
我喜欢您的回答,因为它代表了“中间道路”-不显示,但是可以轻松查找异常。我现在将努力争取这一点,希望他们同意。谢谢!
Vilx- 2012年

2
我认为这几乎是标准的“成熟”方法。另外,stacktrace确实提供了大量信息,但是我还没有找到一种可以自动将状态信息与stacktrace一起记录的解决方案(无需到处更改代码)。看来编写自己的调试器并附加它是一种可行的方法,但是实现起来并不容易。
Daniel B

@DanielB:在Web应用程序中,可以从会话/缓存中获取一些常用的东西(如userid,clientid等)-因为它是“全局”持久的,所以即使很多信息也可以极大地帮助重现错误。如您所说,比这更细粒度是非常棘手的。
乔恩·埃格顿

2
一些非常关键的应用程序的用户要求立即解决任何妨碍正常业务过程的错误。当错误在深夜或周末发生时,仅涉及错误解决程序以掌握错误堆栈的所有涉及不同领域的通信过程都可以轻松消耗1个小时或更长时间。
图兰斯·科尔多瓦

1
@ user1598390:同意,在这种情况下,将错误详细信息复制到受监视的支持邮箱可以加快信息收集的速度,以至于支持人员甚至在用户发现问题之前就知道有问题。
乔恩·埃格顿

29

是的,有很多。

堆栈跟踪可以显示

  • 您使用哪种加密算法
  • 应用程序服务器上的一些现有路径是什么
  • 您是否正确地清理输入
  • 内部如何引用对象
  • 前端背后的数据库版本和品牌是什么

...清单不停。基本上,大型应用程序中的每个设计决策都可能与安全性相关,并且几乎所有决策都可以通过方法或模块名称给出。提醒您,这并不意味着如果提交的环境安全(例如,内部网而不是面向互联网的网站),则显示堆栈跟踪仍然没有任何意义,但是安全成本绝对不是零。


6
我大部分时间都同意,但是其中一些事情并不重要。例如,您所使用的加密算法不必一定是秘密的即可保护您的系统。
Oleksi 2012年

3
没关系,但是世界是不完美的,而且经常如此。这就是为什么深度防御(同时做很多事情,应该是不够的,如果他们是完美的)事项。
Kilian Foth 2012年

3
坦率地说,如果堆栈跟踪揭示了任何可以帮助攻击者的内容,那么您做错了
Mark Booth

3
从统计上来说,@ MarkBooth可能您做错了。不,从头开始-统计确定您弄错了一些。您是否真的要让攻击者先发现您的安全漏洞?
AviD 2012年

1
@AviD-不,我同意,不向用户显示堆栈跟踪的最有说服力的理由是,他们不知道如何处理它们,并且您的日志记录系统应该既安全又能够捕获比屏幕抓取更多的状态网页曾经可以。
Mark Booth 2012年

15

事实是,使自己更轻松不是我们的主要工作。使最终用户更轻松是我们的工作。对我们而言,堆栈跟踪对于提供给开发人员来说是一条非常有用的信息。对于用户而言,看起来完全是胡言乱语,毫无用处。即使您告诉他们其他方式,他们也不会将其内部化。如果您认为很难从系统管理员那里获取信息,那么从最终用户那里获取信息就更糟了。

就安全性而言,如果它是桌面应用程序,您可能会有所了解。在这种情况下,打印堆栈跟踪信息不会提供攻击者不知道的任何信息。在Web应用程序上,攻击者尚无法使用该信息。你确实暴露出内部的细节,这将使攻击一个很多更容易。

为什么不绕过这两个问题源并自动将异常报告发送给您呢?这样,您甚至不必担心人们没有报告错误。


2
由于堆栈跟踪提供了信息,因此用户可以快速解决自己的问题。但我明白你的意思。
图兰斯·科尔多瓦

11

看看这个IT安全SE的问题。简而言之,堆栈跟踪可以为攻击者提供更多信息以供使用。攻击者拥有的信息越多,他们越有可能侵入您的系统。我不会基于堆栈跟踪始终被隐藏这一事实来保证我的安全,但这并不意味着您应该将该信息提供给攻击者。

无论如何,您可以从适当的后端日志记录中获得大部分好处。它的便利性稍差一些,但是可能不值得冒险冒险使用系统的安全性并让您的客户不安。


8

您可能出于以下原因考虑不显示堆栈跟踪。

安全

显示堆栈跟踪记录会发现可能是黑客的攻击面。内部网不能幸免于黑客攻击。如果您的网络因您负责的应用程序而被黑客入侵,则会对您造成严重影响

用户体验

为了使用户获得最佳体验,跟踪跟踪是太多信息。是的,有关错误情况的正确信息应记录下来并由工程师给予注意。但是,让用户执行您可以自动化的操作并不是最适合该用户的方法。

您的声誉

每当在网站上显示堆栈跟踪时,它看起来就很糟糕。大多数人不知道它是什么,这使他们感到该网站对他们不友好。对于那些确实知道它是什么的人,这可能表明该应用程序没有经过深思熟虑。许多写得不好的应用程序过于频繁地显示堆栈跟踪,因为它是ASP.Net等框架中的默认设置。


6
作为软件开发人员,当我在屏幕上看到堆栈跟踪时,我的直觉是“这是一个笨拙的人,对错误的处理一无所知,对错误的关心更少,甚至对用户的关心甚至更少”。其他人则围绕“这是糟糕的软件,不能运行,它的错误处理不起作用”和“ WTF ....我没有为他做这些工作”,您的用户想知道的是他需要做些修复。堆栈跟踪如何做到这一点。
mattnz

6

简短答案:在Extranet或Internet站点中,不显示stacktrace是有意义的。在Intranet中,显示stacktrace的好处超过了隐藏它的好处。

长答案:

我在工作中也发生了同样的事情。我曾经认为,如果某个应用程序失败,那么它应该发出很大的声音。

但是后来他们向我解释说,潜在的黑客可以从堆栈跟踪中推断出很多东西。

我认为没有必要证明。显然,黑客对您的平台越了解,对他越好,黑客对您的平台越了解,对您越好

同样,公司也不急于透露黑客是如何闯入他们的系统的。

另一方面,它是一个Intranet,我认为立即了解发生了什么错误而不必搜索日志文件的优点非常有用,并且在公司边界内显示stacktrace的安全风险不如他们在说。


1
“直接了解出了什么问题的好处”有什么?为什么不能从日志文件中检索它们?似乎使用Intranet,与从客户端站点相比,访问日志文件甚至更加容易。
桑科旺科(Wonko the Sane),2012年

在我的方案中,有优先级为“ 7/24”的关键应用程序。用户呼叫服务台,如果问题是应用程序错误或异常,则服务台会致电可能不在现场的维护人员。如果有错误信息,专家可以指导现场人员解决方法...如果应用程序对业务至关重要,通常节省的时间是宝贵的。如果专家以为前提是必须首先连接到公司,搜索日志等,则可能会不必要地等待关键的业务职能。
图兰斯·科尔多瓦

3
@ user1598390,因此建立日志查看机制。一个简单的网页,输入事件ID,帮助台可以看到整个相关日志。当然会限制对此功能的访问,依此类推……
AviD 2012年

仅仅因为应用程序在您公司的Intranet上并不意味着就没有恶意用户。那里有很多不满的员工,他们很可能滥用内部系统来谋取自己的利益。由于这些员工对公司及其政策了解很多,因此实际上比内部黑客要危险得多。遍历日志文件是一项非常琐碎的任务,尤其是如果您遵循良好的做法并且还将错误记录到特定的错误日志文件中时。
悬崖.meyers

5

在任何交付的产品中,此类错误的预期数量应为零。此信息对客户的效用为零。从这两个方面来看,没有理由提出堆栈跟踪。如果有一些有用的上下文,则应以客户友好的方式呈现,而不是作为堆栈跟踪。

另一方面,如果实际发生的次数不为零,则您非常需要此信息,并且不应依赖于客户将其发送给您。99.99%的时间他们不会。您应该安装一个错误报告系统,该系统将自动提交信息,并且仅需客户的“同意”。


我仅在以下几行中对此答案表示赞同:“此信息对客户的效用为零。” 。除非有充分的理由不这样做,否则产品内部的任何技术细节都应隐藏,除非出于产品最终用户的简单性和可用性。
Kjartan 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.