在 Web 服务中公开异常信息是否存在安全风险?

信息安全 网络服务 错误处理 接触
2021-08-29 16:04:16

众所周知,将异常信息暴露给最终用户会带来安全风险,因为攻击者可以使用它来弄清楚事情在内部是如何工作的并对其进行攻击。但是对于 Web 服务,该信息可能与使用 API 的开发人员相关吗?

一方面暴露完整的堆栈跟踪甚至消息是有风险的,因为它可能包含一些数据库信息,例如另一方面如果出现问题并且服务器只是说 500“对不起”,那么开发人员会感到沮丧。我想真正正确的方法是以安全的方式处理您知道的所有异常,即捕获业务/验证异常并使用特殊的错误代码和消息(无堆栈跟踪)将其返回,并且对于所有未知的仍然使 500 “抱歉”。

但是我想在这里做这件事的常用方法是什么,从安全的角度来看应该采取哪种方法。

3个回答

API 不应公开任何内部信息,即堆栈跟踪或类似信息。正如您真正注意到的那样,它们可能会泄漏可能用于攻击实现的信息。

此外,它们通常只与 API 的开发人员相关,而与 API 的用户无关。这些用户无论如何都希望得到正确的错误消息,而不是一些奇怪的消息,他们需要首先询问 API 开发人员这意味着什么,并且开发人员需要查看源代码。因此,如果您只是将堆栈跟踪抛给用户而不是对用户有意义的东西,那么这可能不是安全问题,而是 API 的可用性问题。

通常,有两种例外情况:

  • 预期的异常,例如无效的输入值;或认证失败;或要求不存在的对象。因此,您可以(并且应该)准备好用描述性和记录的错误代码和消息来优雅地处理这种情况。在这种情况下,没有堆栈跟踪点。

Youtube 无效的视频代码

  • 内部(或意外)异常:数据库不可用;内存不足; 导致NPE的代码中的错误。API user的堆栈跟踪也没有意义但是,您(作为开发人员)对此类堆栈跟踪感兴趣。在大多数情况下,用户自己无法解决此类问题,因此必须联系开发人员。您可以将加密的堆栈跟踪附加到通用的“抱歉”消息,这样开发人员就可以更轻松地解决用户问题:

Youtube 内部错误

这是一个可用性安全性的问题。

  • API,特别是 REST API,应该是友好的、自我记录的。这包括给出友好的错误,指出确切的错误、可能的原因、堆栈等。

  • 另一方面认为友好是有风险的......

所以答案是:是的,这是一个安全问题。这些信息将帮助潜在的攻击者更多地了解您的 API。

常见的做法?

ASP.NET中,您可以在web.config中进行设置以控制错误的详细程度(CustomErrors)。

默认设置显示一般安全错误,除非您是从同一台计算机浏览,否则它会显示完全错误。这样,本地计算机中的开发人员可以看到错误,但一旦部署到环境中,就无法看到详细的错误信息。

<?xml version="1.0"?>
<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>