代码之家  ›  专栏  ›  技术社区  ›  VirtuosiMedia

403禁止vs 401未经授权的HTTP响应

  •  2201
  • VirtuosiMedia  · 技术社区  · 14 年前

    对于存在但用户没有足够权限(他们没有登录或不属于正确的用户组)的网页,要提供什么适当的HTTP响应?401?403?还有别的吗?到目前为止,我读到的每一篇文章都不太清楚这两者之间的区别。哪些用例适用于每个响应?

    14 回复  |  直到 5 年前
        1
  •  3277
  •   JPReddy    7 年前

    清楚的解释 Daniel Irvine :

    有个问题 401未经授权 ,验证错误的HTTP状态代码。这就是它:它用于认证,而不是授权。 服务器会告诉您,收到401响应,即“您不是”。 已认证“或根本未认证或已认证” __错误,但请重新验证并重试。__要帮助您, 它将始终包括 WWW认证 描述如何 进行身份验证。

    这是Web服务器通常返回的响应,而不是Web 应用。

    它也是非常临时的;服务器要求您尝试 再一次。

    因此,为了获得授权,我使用 403禁止 反应。它是 永久性,它与我的应用程序逻辑联系在一起,而且它更具体。 而不是401。

    服务器会告诉您403响应,对不起。我知道 你是谁?我相信你说你是谁,但你只是没有 访问此资源的权限。也许如果你问系统 管理员很好,您将获得许可。但是请不要麻烦了 在你的困境改变之前,我会再来一次。

    综上所述,A 401未经授权 响应应用于丢失 或错误的身份验证,以及 403禁止 应使用响应 之后,当用户通过身份验证但未被授权 对给定资源执行请求的操作。

    另一 nice pictorial format 如何使用HTTP状态代码。

        2
  •  353
  •   StampyCode    7 年前

    RFC2616 :

    401未经授权:

    如果请求已包含授权凭据,则401响应指示已拒绝这些凭据的授权。

    403禁:

    服务器理解请求,但拒绝完成请求。

    更新

    从您的用例来看,用户似乎没有经过身份验证。我要退401。


    编辑: RCF2616 已过时,请参阅 RFC7231 RFC7235 .

        3
  •  272
  •   nakhodkin Infinias    5 年前

    其他答案缺失的是,必须理解的是,在RFC2616上下文中的身份验证和授权仅指RFC2617的HTTP身份验证协议。HTTP状态代码不支持由RFC2617之外的方案进行身份验证,并且在决定是否使用401或403时不考虑该验证。

    简而言之

    unauthorized表示客户端未通过RFC2617身份验证,服务器正在启动身份验证过程。Forbidden表示客户端已通过RFC2617身份验证且没有授权,或者服务器不支持请求的资源的RFC2617。

    也就是说,如果您有自己的Roll登录过程并且从不使用HTTP身份验证,403总是正确的响应,401永远不应该使用。

    详细和深入

    从RCF2616

    10.4.2 401未经授权

    请求需要用户身份验证。响应必须包括一个www-authenticate头字段(第14.47节),其中包含适用于请求资源的质询。客户可以使用适当的授权头字段(第14.8节)重复请求。

    10.4.4 403禁止 服务器理解请求,但拒绝完成请求。授权没有帮助,请求不应重复。

    首先要记住的是,本文档上下文中的“身份验证”和“授权”专门指的是来自RFC2617的HTTP身份验证协议。它们不涉及您自己使用登录页面创建的任何Roll身份验证协议等。我将使用“登录”来指由RFC2617以外的方法进行的身份验证和授权。

    所以真正的区别不是问题是什么,或者即使有解决方案。区别在于服务器期望客户机接下来做什么。

    401表示无法提供资源,但服务器请求客户端通过HTTP身份验证登录,并已发送回复头来启动进程。可能存在允许访问资源的授权,可能没有,但让我们尝试一下,看看会发生什么。

    403表示无法提供资源,当前用户无法通过rfc2617解决此问题,无法尝试。这可能是因为已知没有足够的身份验证级别(例如,由于IP黑名单),但可能是因为用户已经过身份验证,并且没有权限。rfc2617模型是一个用户,一个凭证,因此用户可能拥有第二组可以授权的凭证的情况可能会被忽略。它既不建议也不暗示某种登录页面或其他非RFC2617身份验证协议可能有帮助,也可能没有帮助——这超出了RFC2616标准和定义。


    编辑: RFC2616 已过时,请参阅 RFC7231 RFC7235 .

        4
  •  105
  •   Cumbayah    14 年前

    根据 RFC 2616 (http/1.1)403在以下情况下发送:

    服务器理解请求,但拒绝完成请求。授权没有帮助,请求不应重复。如果请求方法不是head,并且服务器希望公开未满足请求的原因,那么它应该描述实体中拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)。

    换句话说,如果客户机可以通过身份验证访问资源,那么应该发送401。

        5
  •  95
  •   Christophe Roussy    5 年前
       Resource exists ?
        |       |
     NO |       | YES
        v       v
       404      Is logged-in (authenticated) ?
       or         |              |
       401     NO |              | YES
       403        |              |
                  v              v
                  401            Can access resource, permissions (authorized) ?
             (404 no reveal)      |            |
                 or 301        NO |            | YES
                 redirect         |            |
                 to login         v            v
                                  403          OK 200, 301, ...
                          (or 404: no reveal)
    
    

    检查通常按以下顺序进行:

    • 401如果未登录或会话已过期
    • 403如果用户没有访问资源的权限
    • 404如果资源不存在

    未经授权的 :状态代码(401),指示请求需要 认证 通常这意味着用户需要登录(会话)。服务器未知的用户/代理。可以与其他凭据一起重复。注意:这很容易混淆,因为它应该被命名为“未经身份验证”而不是“未经授权”。如果会话过期,登录后也可能发生这种情况。 特殊情况:可以用404代替404,以避免暴露资源的存在或不存在(credits@gingercodeninja)

    被禁止的 :状态代码(403),指示服务器理解请求,但拒绝完成请求。服务器已知但具有的用户/代理 凭据不足 . 重复请求将不起作用,除非凭证发生更改,这在短时间内是不太可能的。 特殊情况:可使用404代替404,以避免显示资源的存在或不存在(credits@gingercodeninja)

    找不到 :状态代码(404),指示请求的资源不可用。已知的用户/代理,但服务器不会显示有关该资源的任何信息,就像它不存在一样。重复不起作用。这是404的一个特殊用途(例如,Github就是这样做的)。

        6
  •  39
  •   Erwan Legrand    5 年前

    假设HTTP身份验证 ( WWW认证 授权 报头) 正在使用中 ,如果作为另一个用户进行身份验证将授予对请求的资源的访问权,则应返回401 unauthorized。

    403禁止在禁止所有人访问资源或限制在给定网络或仅允许通过SSL访问资源时使用,只要与HTTP身份验证无关。

    如果未使用HTTP身份验证 该服务是一个基于cookie的认证方案,就像现在的标准一样,然后应该返回403或404。

    关于401,这是来自RFC7235(超文本传输协议(HTTP/1.1):身份验证):

    3.1。401未经授权

    401(未授权)状态代码指示请求 未应用,因为它缺少有效的身份验证凭据 对于目标资源。源服务器必须发送 www-authenticate头字段(第4.4节)至少包含一个 适用于目标资源的挑战。 如果请求 包括身份验证凭据,然后是401响应 表示已拒绝授权 资格证书 . 客户端可以用新的或 已替换授权标题字段(第4.1节)。如果401 响应包含与先前响应相同的挑战,并且 用户代理至少已经尝试过一次身份验证,然后 用户代理应向 用户,因为它通常包含相关的诊断信息。

    403(和404)的语义随时间而变化。这是从1999年开始的(RFC 2616):

    10.4.4 403禁止

    服务器理解请求,但拒绝完成请求。
    授权没有帮助 请求不应重复。
    如果请求方法不是head,服务器希望
    公开为什么请求没有得到满足,它应该描述 实体中拒绝的原因。如果服务器不希望 将此信息提供给客户端,状态代码404
    (未找到)可以使用。

    2014年,RFC7231(超文本传输协议(HTTP/1.1):语义和内容)改变了403的含义:

    5.5.3.403禁止

    403(禁止)状态代码表示服务器 理解请求但拒绝授权。一个服务器 希望公开请求被禁止的原因可以 在响应负载(如果有的话)中描述这个原因。

    如果请求中提供了身份验证凭据,则
    服务器认为它们不足以授予访问权限。客户
    不应自动重复请求
    资格证书。客户端可以用new或different重复请求 资格证书。但是,由于某些原因,请求可能被禁止
    与证书无关。

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

    因此,403(或404)现在可能意味着任何事情。提供新凭据可能会有所帮助…或者可能不会。

    我相信这一变化的原因是RFC2616假设在实际应用中使用HTTP身份验证时,今天的Web应用程序使用例如表单和cookie构建自定义身份验证方案。

        7
  •  25
  •   Patrick White    9 年前

    这是一个古老的问题,但一个从未真正提出的选择是返回404。从安全的角度来看,投票率最高的答案有潜在的 information leakage vulnerability . 例如,假设所讨论的安全网页是系统管理页,或者更常见地说,是用户无权访问的系统中的记录。理想情况下,您不希望恶意用户知道那里有一个页面/记录,更不用说他们没有访问权限。当我构建这样的东西时,我将尝试在内部日志中记录未经身份验证/未经授权的请求,但返回404。

    OWASP有一些 more information 关于攻击者如何使用此类信息作为攻击的一部分。

        8
  •  20
  •   Dave Watts    10 年前

    这个问题一段时间前就被问到了,但人们的思想还在继续。

    Section 6.5.3 在本草案(由Fielding和Reschke撰写)中,状态代码403的含义与 RFC 2616 .

    它反映了许多流行的Web服务器和框架使用的身份验证和授权方案中所发生的情况。

    我强调了我认为最突出的一点。

    5.5.3.403禁止

    403(禁止)状态代码表示服务器理解请求,但拒绝授权。希望公开请求被禁止的原因的服务器可以在响应负载(如果有)中描述该原因。

    如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限。 客户端不应使用相同的凭据重复请求。客户端可以使用新的或不同的凭据重复请求。 但是,由于与凭据无关的原因,可能会禁止请求。

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

    无论您使用什么约定,重要的是在您的站点/API中提供一致性。

        9
  •  10
  •   Levite    6 年前

    DR

    • 401:与认证有关的拒绝
    • 403:与认证无关的拒绝

    实例

    如果 阿帕奇 需要身份验证 (通过 .htaccess 你击中了 Cancel ,它将以 401 Authorization Required

    如果 恩吉克斯 查找文件,但没有 访问权限 (用户/组)要读取/访问它,它将用 403 Forbidden

    RFC(2616第10节)

    401未经授权(10.4.2)

    含义1: 需要验证

    请求需要用户身份验证。…

    含义2: 身份验证不足

    …如果请求已包含授权凭据,则401响应指示已拒绝这些凭据的授权。…

    403禁止(10.4.4)

    含义: 与身份验证无关

    …授权没有帮助…

    更多细节:

    • 服务器理解请求,但拒绝完成请求。

    • 应说明实体拒绝的原因。

    • 可以使用状态代码404(未找到)代替

      (如果服务器希望从客户端保留此信息)

        10
  •  9
  •   Zaid Masud    6 年前

    它们未登录或不属于正确的用户组

    您已经陈述了两个不同的案例;每个案例都应该有不同的回应:

    1. 如果他们根本没有登录,你应该返回 401未经授权
    2. 如果它们已登录,但不属于正确的用户组,则应返回 403禁止

    基于收到的回复意见的RFC说明:

    如果用户没有登录,那么他们是未经身份验证的,HTTP等价物是401,在RFC中被错误地称为未经授权。AS section 10.4.2 状态为 401未经授权 :

    “请求需要用户 认证 ."

    如果您未经身份验证,401是正确的回答。但是,如果您未经授权,在语义正确的意义上,403是正确的响应。

        11
  •  3
  •   Grant Gryczan    5 年前

    我认为重要的是要考虑到,对于浏览器来说,401会启动一个身份验证对话框,让用户输入新的凭证,而403则不会。浏览器认为,如果返回401,那么用户应该重新进行身份验证。所以401代表无效身份验证,403代表缺少权限。

    在这种逻辑下,有些情况下,认证或授权会返回一个错误,其中重要的短语用粗体显示。

    • 资源需要身份验证,但 无证书 明确规定 .

    四百零一 :客户端应指定凭据。

    • 指定的凭据位于 无效格式 .

    四百 :这既不是401也不是403,因为语法错误应该总是返回400。

    • 指定的凭据引用 用户 哪一个 不存在 .

    四百零一 :客户端应指定有效的凭据。

    • 指定的 资格证书 无效 但请指定有效的用户(如果不需要指定的用户,请不要指定用户)。

    四百零一 :同样,客户端应指定有效的凭据。

    • 指定的 资格证书 期满 .

    四百零一 :这实际上与通常具有无效凭据相同,因此客户端应指定有效凭据。

    • 指定的凭据完全有效,但不有效 够了 特定的 资源 ,但具有更多权限的凭据可能会。

    四百零三 :指定有效凭据将不会授予对资源的访问权限,因为当前凭据已经有效,但仅没有权限。

    • 特定的 资源 难以接近的 不考虑证书。

    四百零三 :这与凭据无关,因此指定有效凭据没有帮助。

    • 指定的凭据完全有效,但特定的 客户机 此路不通 避免使用它们。

    四百零三 :如果客户端被阻止,则指定新凭据将不起任何作用。

        12
  •  2
  •   Val Kornea    7 年前

    这在我的头脑里比这里任何地方都简单,所以:

    401:您需要http-basic-auth来查看这个。

    403:你看不到这一点,HTTP基本身份验证也无济于事。

    如果用户只需要使用您站点的标准HTML登录表单登录,401将不合适,因为它是特定于HTTP基本身份验证的。

    我不建议使用403来拒绝访问 /includes 因为就网络而言,这些资源根本不存在,因此应该是404。

    这将403保留为“您需要登录”。

    换句话说,403意味着“这个资源需要某种形式的认证,而不是HTTP基本认证”。

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2

        13
  •  0
  •   cjbarth    6 年前

    考虑到最新的RFC对此事的看法( 7231 7235 )用例看起来很清楚(斜体字添加):

    • 401是为了 unauthenticated (缺乏有效的认证);也就是说,‘我不知道你是谁,或者我不相信你说的是谁。’

    401未经授权

    401(未授权)状态代码表示请求没有 因为它而被应用 缺少有效的身份验证 资格证书 目标资源。生成401响应的服务器必须发送 www-authenticate头字段(第4.1节),至少包含一个 适用于目标资源的挑战。

    如果请求包括身份验证凭据,则401 响应表示已拒绝这些授权 资格证书。用户代理可以用新的或 已替换授权标题字段(第4.2节)。如果401 响应包含与先前响应相同的挑战,并且 用户代理至少已经尝试过一次身份验证,然后 用户代理应向 用户,因为它通常包含相关的诊断信息。

    • 403是为了 unauthorized (拒绝授权);即‘我知道你是谁,但你没有访问此资源的权限。’

    403禁止

    403(禁止)状态代码表示服务器理解 请求但 拒绝授权 它。希望 公开禁止请求的原因可以描述这一点 响应负载中的原因(如果有)。

    如果请求中提供了身份验证凭据,则 服务器认为它们不足以授予访问权限。客户 不应自动重复请求 资格证书。客户端可以用new或different重复请求 资格证书。但是,由于某些原因,请求可能被禁止 与证书无关。

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

        14
  •  -4
  •   Shawn    9 年前

    在401对403的情况下,这已经被多次回答了。这本质上是一个“HTTP请求环境”辩论,而不是一个“应用程序”辩论。

    您自己的登录问题(应用程序)似乎有问题。

    在这种情况下,不登录不足以发送401或403,除非使用http auth与登录页(不绑定到设置http auth)。听起来您可能在寻找一个“201已创建”,有一个滚动您自己的登录屏幕(而不是请求的资源)来访问一个文件。这说明:

    “我听到了,它在这里,但是你可以试试这个(你不允许看到它)”。