对于不存在的REST资源,什么时候返回404,什么时候返回403?

Adr*_*ith 2 rest

我熟悉这个逻辑,如果你想用用户名和密码验证某人,你应该返回同样的错误,不管用户名是否找到,或者密码是否错误。这个想法是,如果您返回单独的“未找到用户”和“找到用户,但密码错误”错误,攻击者可以尝试所有用户名并找出哪些用户名有效,然后将他们的字典攻击集中在这些用户名上.

使用 REST 服务,我有一个只有某些用户可以访问的资源,我们称之为/foo/{id}。所以有各种各样的情况:

  1. 用户尝试访问/foo/4并且他们有权访问,他们显然会得到 200 响应和资源。

  2. 用户尝试访问/foo/3但它不存在。(如果它确实存在,我不知道他们是否可以访问它,因为它不存在。想想 Facebook 上不存在的照片,照片只有存在时才具有所有权信息。)

  3. 用户尝试访问/foo/4,它存在,但他们没有访问权限。

所以我的问题是,在情况 2 和 3 中返回什么返回码?据我所知,有以下选项:

  1. 情况 2 返回 404,情况 3 返回 403。但这意味着攻击者可以找出存在哪些对象,类似于第一个示例中的密码示例。

  2. 所有例子都返回404,毕竟从用户的角度来看,他们无权访问的资源“不存在”,如果他们列出所有他们有权访问的资源,该资源将不在列表中.

  3. 所有示例都返回 403。

你会怎么办?这里的标准是什么?

Voi*_*son 5

这里的标准是什么?

RFC 7231 6.5.3

希望“隐藏”当前存在的被禁止目标资源的源服务器可能会以 404(未找到)状态代码响应。

有趣的是,在HTTP/1.0 中,这被扭转了

如果服务器不想让客户端可以使用此信息,则可以使用状态代码 403(禁止)。

您应该知道 403 和 404 具有不同的默认缓存行为。

OWASP:异常处理

查看错误响应时,请注意恶意用户无法从返回的状态代码中收集到有关系统的任何潜在敏感信息。例如:API 搜索采用租户 ID 参数,如果没有结果则返回 HTTP 404 响应,如果租户 ID 不存在则返回 HTTP 500 响应。攻击者可能会利用此信息来确定租户 ID 是否有效。一种解决方案是在提供的租户 ID 不存在时捕获抛出的异常,并返回带有错误响应的 HTTP 404 状态代码。

请注意,状态代码并不是唯一可以被利用的响应部分;如果您打算通过对齐状态代码的努力,您还应该确保消息正文和标题也不会泄露任何内容,响应的时间不会泄露显示,等等。