【问题标题】:Use case for responding with 403 status code使用 403 状态码响应的用例
【发布时间】:2014-12-26 14:03:32
【问题描述】:

我最近开始开发 Java EE 应用程序,我正在尝试更多地了解 HTTP 状态代码以及何时应该使用它们。

我遇到的一种情况是当用户登录并想要查看订单状态时。要求是用户不能检查不属于他们的订单的状态。

查询订单的网址例如:

mysite.com/order/status?id=22594

处理此请求的 servlet 将检查 ID 参数,然后从数据库中检索订单。

如果用户输入了他们未提交的订单的 ID,是否适合返回 403,或者以未找到的订单进行响应?

【问题讨论】:

  • 我会转发到正确的 403,因为禁止用户访问此 url。

标签: java http jakarta-ee http-status-code-403


【解决方案1】:

如果用户没有提交订单,或者订单不属于用户,则返回以下任一响应:

  1. 404- 找不到资源。 如果这样,则不会向用户显示 存在其他用户的订单 ID。
  2. 401-未授权。这将表明该订单存在,但不属于请求用户。

从安全角度来看,最好返回 404。

【讨论】:

    【解决方案2】:

    来自w3.org:

    服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态码 404(未找到)。

    在您的情况下,出于安全原因,显示未找到订单可能是个好主意,但通常答案是 403

    【讨论】:

      【解决方案3】:

      对于用户未提交的订单 ID(丢失或不是他们的订单),我倾向于返回 HTTP 404。这里的原因是用户被授权访问/order/status 页面但是没有找到特定的订单ID。

      如果订单 ID 无效,我觉得返回 HTTP 403 会向用户发送错误消息(此处不允许您)。

      订单不存在或订单不属于认证用户;错误应该是相同的,否则您将面临“泄露”系统中订单信息的风险。

      【讨论】:

        【解决方案4】:

        在您的典型情况下,我可以想到以下用例:

        未找到订单 ID

        • 发送 404。订单不存在。

        订单 ID 属于其他人。

        • 如果用户已登录,则发送 403。(403 表示:“我知道你是谁,但不允许你访问此资源)
        • 发送 404。有时适合发送此状态。您不想让最终客户知道资源是否存在。此经过身份验证和授权的用户的资源存在,或者不存在。

        用户未登录

        • 尝试访问资源时发送401“需要身份验证”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-24
          • 2010-11-19
          • 2020-08-04
          • 2018-07-09
          • 2022-08-16
          • 2014-11-14
          • 2016-04-14
          相关资源
          最近更新 更多