
为什么我们需要为开源代码提供开放的错误信息
混淆或清理错误信息可能很诱人,但这通常不是一个好主意。您可能认为将错误信息美化一下对用户更好,或者您可能认为如果不提供任何错误消息对安全更有利。
如果您不将错误信息美化,用户又如何理解错误呢?如果攻击者使用错误信息来反向工程您的系统的工作方式怎么办?
可能存在隐藏或掩盖错误的合理理由,但这里有五个充分的理由来正视它们。
1. 准确的错误信息意味着准确的错误报告
最近,有人向我推荐了一个在流行的 Git 托管服务上的 Git 仓库。但是,当我导航到该 URL 时,我得到了一个宣布 404 错误的页面。
在 HTTP 协议中,错误 404 意味着请求的页面不存在,因此我开始在假设我被告知了错误的 URL 的情况下调查问题。
我分析了 URL 的不同组成部分,验证了 Git 仓库名称以及我的浏览器运行正常。
一切似乎都正确,但我仍然得到 404 错误。
最终,结果证明 Git 托管服务对我撒谎了。页面确实存在。只是我没有访问权限。我只需要请求仓库所有者将我添加到项目中即可。
问题是?那不是 404 错误。如果说有什么,那也是 403 Forbidden 错误,但它根本不是 HTTP 错误。事实上,这不是错误。当站点数据库中没有权限的人尝试查看特定记录时,这是预期且正确的结果。
我只能假设站点程序员将虚假的 404 页面视为一种既不确认也不否认页面存在的简便方法。似是而非的否认是一种有用的安全技术,但有更好的方法来表达它,例如“如果此仓库存在,则您无权查看它。否则,不存在这样的仓库。”
您越是试图为用户解释错误,就越有可能收到不准确的错误报告。

2. 错误信息促进自助支持
以简单明了的语言提供的错误信息意味着任何对系统有能力的人都可以修复该错误。像“登录失败”这样显而易见但不具描述性的错误会在用户面前设置一道障碍。
像“找不到私钥文件”或“无法连接到 Kerberos 服务器”这样具有描述性的错误信息会告诉了解流程应该如何工作的用户故障发生在哪里。用户的调查可以从所述问题开始,并可能导致用户在不麻烦您寻求支持的情况下解决问题。
当您混淆或隐藏错误信息时,您是在邀请所有人,只要出现问题就联系您寻求帮助。如果您不提供支持的联系方式,那么您就是在用户群中播下无助和怨恨的种子。
3. 错误信息促进系统加固
我对于向任何频繁攻击我的服务器以获取错误信息的人透露太多关于我的系统的信息感到紧张。发现错误并将其用作系统配置方式的上下文是一种有效且成功的攻击技术。
但是,通过您从系统中获得的预期响应来构建系统配置文件也是一种同样有效且成功的攻击技术。
换句话说,如果攻击者分析您的系统,他们会从有效的功能和无效的功能中了解到关于系统的信息。错误信息可能会为攻击者提供指向已知漏洞的线索,但日常响应也是如此。没有攻击者会等待错误消息,然后再尝试利用漏洞。
攻击不是这样运作的。攻击者针对您的系统运行所有已知的漏洞利用程序,使用脚本或自动化框架,并希望其中一个有效。在采取行动之前坐下来寻找错误信息太麻烦了。
了解了这一点,管理员的工作是确保系统受到保护,免受常见的攻击技术的影响。检测正在发生的攻击,动态阻止不寻常活动的 IP 源,并确保您的软件是最新的。这些是对抗攻击的适当防御措施,并且它们都不涉及混淆错误消息。
4. 错误的错误
错误发生是因为某些地方出了问题。当您尝试混淆错误消息时,您正在附加一个新的子系统,该子系统本身也容易出错。那么当您的错误拦截子系统出现错误时会发生什么?
错误不会一直向下传递,所以在某个时候,一个真正的错误会传递过去,然后您所拥有的只是关于错误的错误,而永远不是错误本身。不仅您的用户不知道哪里出了问题,您也不知道。
5. 开放协作
如果您还没有对错误麻木,错误可能会让人感到尴尬。您可能会觉得错误暴露了您是一个糟糕的程序员或一个糟糕的系统管理员。但现实情况是,没有人会这样看待它。每个人都知道技术是不完美的。错误会发生。
当您与世界分享错误信息时,很有可能有人会帮助修复它们。当某些事情变得足够烦人时,您可能会惊讶于用户的积极性。
而且这种情况经常发生,无论您是否参与其中。对于各种问题,都有非官方的修复程序、解决方法、模组和黑客方法。
您的用户将找到并使用这些技术,无论您是否承认该错误甚至存在。所以选择权在您手中。您可以帮助您的用户取得成功(并接受他们可以帮助您取得成功),或者您可以忽略问题,并迫使您的用户浪费时间和精力去寻找非官方的解决方法。
其中一种技术孕育了协作和互助。
另一种技术孕育了挫败感、愤怒和怨恨。
错误是好事
诚然,并非每个人都欣赏 堆栈跟踪 或 核心转储 的出现。并非所有错误都必须是丑陋的。您可以使它们看起来不错——您可能可以在遇到错误时,在错误信息前面或后面添加有用的消息,告诉用户他们接下来可以尝试什么。
对不理解错误如何或为何发生的用户保持友好至关重要。但同样重要的是要理解,有些错误非常糟糕,它们会跳过您预期的拦截,并且提供准确的错误信息对于一部分用户来说非常重要,并且可以极大地惠及您和使用您的应用程序或服务的人们。
照片由 Ben Hershey 拍摄于 Unsplash