http-status-codes - 403 Forbidden VS 401 Unauthorized http响应

  显示原文与译文双语对照的内容

对于存在的网页,但对于没有足够权限的用户来说,( 它们没有登录或者不属于适当的用户组) 是正确的HTTP响应? 401 403别的东西目前我已经阅读在每个的内容不是很清楚在这两个上。区别 每个响应适用何种用例?

时间:

来自 Daniel Irvine的一个明确解释:

401未经授权的,用于验证错误的HTTP状态代码。 这只是为了验证,而不是授权。 接收 401响应是服务器告诉你,"你不是 authenticated–either,根本没有认证或者验证incorrectly–but请重新验证并重试。"要帮助你,它将总是包含一个 WWW-Authenticate 头,描述如何认证。

这是你的网络服务器通常返回的响应,而不是你的站点应用程序。

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

所以,对于授权,我使用了 403的Forbidden响应。 它是永久性的,它与我的应用程序逻辑相关联,它是一个比 401更具体的响应。

接收 403响应是服务器告诉你,"对不起。 我知道你are–I谁相信谁你说你are–but眼见不一定权限才能访问该资源。 如果你向系统管理员很好的询问,你会得到权限。 但在你的困境发生之前,请不要再打扰我。"

根据给定的resource,综上所述,一个 401丢失或者不正确应该用于身份验证和授权的响应一个 403禁止响应应随后,当对用户进行身份验证时使用,但没有授权无法执行所请求的操作。

请参阅 RFC 。exe:

401未授权:

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

403禁止:

.服务器理解此请求,但是拒绝执行它

更新

从你的用例中,似乎用户没有经过身份验证。 我将返回 401.

缺少其他的答案是,必须理解在 RFC 2616上下文中的身份验证和授权仅引用 RFC 2617的HTTP身份验证协议。 在HTTP状态代码中不支持RFC2617之外的按方案验证,在决定是否使用 401或者 403时不被考虑。

简洁简洁

未授权表示客户端未经过身份验证,并且服务器正在初始化身份验证进程。 被禁止表示客户端为RFC2617身份验证并且没有授权或者服务器不支持请求的资源的RFC2617.

意味着如果你拥有自己的roll-your-own登录进程,并且从不使用HTTP身份验证,403总是正确的响应,401永远不会被使用。

详细和深入

来自 RFC2616

10.4.2 401未授权

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

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

首先要记住的是,本文上下文中的"身份验证"和"授权"特指来自 RFC 2617的HTTP身份验证协议。 它们不引用任何你可能使用登录页面创建的roll-your-own身份验证协议,等等 将使用"登录"来引用除RFC2617以外的方法的身份验证和授权

所以真正的区别不是问题是什么,甚至有一个解决方案。 区别在于服务器下一步要做什么。

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

403表示无法提供资源,对于当前用户,没有办法通过RFC2617解决这里问题,并且在尝试时没有任何问题。 这可能是因为已知没有足够的身份验证级别,但这可能是因为用户已经过身份验证并且没有权限。 RFC2617模型是 one-user,one-credentials,这样用户可能有第二组可以被授权的凭据被忽略。 这既不建议也不暗示某种登录页面或者其他non-RFC2617身份验证协议可能会或者不可能帮助- 这超出了RFC2616标准和定义。

根据 RFC 2616 ( http/1.1 ) 403: 时,发送

.服务器理解此请求,但是拒绝执行它 授权没有帮助,请求不应该重复。 如果请求方法无效,服务器希望公开请求的原因,那么应该描述在实体中拒绝的原因。 如果服务器不想使这里信息对客户端可用,则可以使用状态代码 404 ( 找不到)

换句话说,如果客户端可以通过身份验证访问资源,则应该发送 401.

如果作为另一个用户的身份验证将授予对请求资源的访问权,则应该返回 401. 403禁止主要用于在访问该资源对每个人都是被禁止或者限制在一个给定的网络或者只允许的SSL,不管是什么,只要它没有涉及到身份验证。

从 RFC 7235 ( 超文本传输协议( http/1,1 ): 验证):

3.1.401未授权

401 ( 未授权的) 状态代码表示没有应用请求,因为它缺少目标资源的有效身份验证凭据。 原始服务器必须发送一个WWW-Authenticate头字段( 第 4.4节),该字段至少包含一个适用于目标资源的挑战。 于这些凭据相关, 身份验证凭据,那么如果请求包含 401响应表明已经refused.授权 客户端可以用新的或者替换的授权头字段( 第 4.1节) 重复请求。 如果 401响应包含与以前的响应相同的质询,并且 User Agent 已经至少尝试了一次身份验证,那么 User Agent 应该向用户呈现封闭的表示,因为它通常包含相关的诊断信息。

这是来自 RFC 2616的:

10.4.4 403禁止

.服务器理解此请求,但是拒绝执行它
授权不会帮助,请求不应该重复。
如果请求方法不是HEAD并且服务器希望
公众为什么没有完成请求,它应该描述在实体中拒绝的原因。 如果服务器不希望这里信息对客户端可用,则状态代码 404
( 未找到) 可以使用。

编辑:RFC 7231 ( 超文本传输协议( http/1,1 ): 语义和内容更改 403的含义:

6.5.3 。403禁止

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

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

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

因此,403现在可能意味着。 提供新凭据可能会有所帮助。。 或者可能不是。

这个问题在很久以前被问到了,但是人们在思考。

节 6.5.3在这里草稿( 通过启动和Reschke编写) 中的RFC 2616中的文档提供了状态代码 403略有不同。

它反映了在计算产品成本的时候大量的流行web-servers认证&授权方案和框架中,会发生什么情况。

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

6.5.3 。403禁止的

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

如果请求中提供了身份验证凭据,服务器将认为它们不足以授予访问权限。 客户端不应该用相同的凭据重复请求。 客户端可以使用新的或者不同的凭据重复请求。 于的原因没有关联到相关 credentials, 但是,一个请求可能是 forbidden.

希望"隐藏"的源服务器当前存在的源服务器,可以用 404 ( 找不到)的状态代码来响应。

无论使用什么约定,重要的是在站点/api之间提供一致性。

这是一个较老的问题,但一个从未真正提出的选项是返回 404. 从安全角度来看,最高投票的答案会受到潜在的信息泄露漏洞 。 比如说,安全网页是一个系统管理页面,或者更常见的是,用户没有访问的系统中的记录。 理想情况下,你不想恶意用户甚至知道有一个页面/记录,更不用说他们没有访问权限。 当我构建类似这样的东西时,我会尝试在一个内部日志中记录 unauthenticate/未授权的请求,但返回 404.

OWASP有一些更多信息关于攻击者如何使用这种类型的信息作为攻击的一部分。

它们没有登录或者不属于适当的用户组

你已经说明了两种不同的情况;每种情况应该具有不同的响应:

  1. 在在所有你应该返回 401未经授权,如果它们不会被记录
  2. 如果已经登录但不属于适当的用户组,则应该返回 403的Forbidden

实际示例

如果 apache 需要认证 ( 通过 .htaccess ),并且你点击 Cancel,它将用 401 Authorization Required 响应

如果 Nginx 找到一个文件,但没有访问权限 ( 用户/组) 读取/访问它,它将用 403 Forbidden 响应

RFC ( 2616节 10 )

401未授权( 10.4.2 )

这意味着 1: 需要验证

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

含义 2: 的身份验证不足

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

403被禁止( 10.4.4 )

含义:与认证无关

。Authorization授权将无法帮助。。

更详细:

  • .服务器理解此请求,但是拒绝执行它

  • 它应该描述在实体中拒绝的原因

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

    ( 如果服务器想要保留这里信息)

TL ;DR

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

TLDR版本:

未经授权( 401 ): 状态代码,表明该请求都需要认证。 服务器未知的用户/代理。 可以与其他凭据重复。

禁止的: 状态码( 403 ) 表示服务器理解请求但拒绝履行它。 服务器已知但凭据不足的用户/代理。 重复请求通常无法工作。

( 404 ): 状态代码,指示未找到所请求的资源不可用。 已知的用户/代理,但服务器不会透露关于资源的任何信息,就像它不存在一样。 重复将不起作用。这是 404的特殊用法。

...