对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
当前回答
这是一个更老的问题,但一个从未真正提出过的选项是返回404。从安全角度来看,投票最高的答案存在潜在的信息泄漏漏洞。例如,假设所讨论的安全网页是一个系统管理页面,或者更常见的是,是一个用户无权访问的系统记录。理想情况下,您不希望恶意用户知道那里有一个页面/记录,更不用说他们无权访问。当我构建这样的东西时,我将尝试在内部日志中记录未经验证/未经授权的请求,但返回404。
OWASP提供了有关攻击者如何将此类信息用作攻击一部分的更多信息。
其他回答
丹尼尔·欧文(Daniel Irvine)的明确解释[原始链接]:
401 Unauthorized(401未授权)存在问题,这是身份验证错误的HTTP状态代码。这就是它:它用于身份验证,而不是授权。收到401响应时,服务器会告诉你,“你不是已验证–完全未验证或已验证不正确–但请重新验证并重试。”为了帮助您,它将始终包含一个WWW Authenticate标头,描述如何以进行身份验证。这是通常由web服务器而不是web返回的响应应用这也是非常暂时的;服务器要求您尝试再一次因此,为了获得授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑有关,而且更具体响应大于401。收到403响应时,服务器会告诉你:“对不起,我知道你是谁——我相信你说的你是谁,但你只是没有访问此资源的权限。也许如果你问系统管理员很好,你会得到许可的。但请不要打扰直到你的困境改变。”总之,401未经授权的响应应用于缺失或认证错误,应使用403禁止响应之后,当用户经过身份验证但未被授权对给定资源执行请求的操作。
另一种很好的图片格式,说明如何使用http状态代码。
我对它的看法与公认的答案略有不同。
当认证失败时返回403,当授权失败时返回401,这似乎更符合语义和逻辑。
我的理由如下:
当您请求认证时,您有权提出该请求。你需要这样做,否则一开始就没有人能够通过认证。
如果您的身份验证失败,您将被禁止,这是有意义的。
另一方面,被禁止者也可以申请授权,但假设您已通过身份验证,但无权访问特定端点。返回401 Unauthorized似乎更有意义。
对于失败的身份验证尝试,Spring Boot的安全性返回403
这是一个更老的问题,但一个从未真正提出过的选项是返回404。从安全角度来看,投票最高的答案存在潜在的信息泄漏漏洞。例如,假设所讨论的安全网页是一个系统管理页面,或者更常见的是,是一个用户无权访问的系统记录。理想情况下,您不希望恶意用户知道那里有一个页面/记录,更不用说他们无权访问。当我构建这样的东西时,我将尝试在内部日志中记录未经验证/未经授权的请求,但返回404。
OWASP提供了有关攻击者如何将此类信息用作攻击一部分的更多信息。
401未经授权:我不知道你是谁。这是一个身份验证错误。403禁止:我知道你是谁,但你没有访问此资源的权限。这是一个授权错误。
401:您需要HTTP基本身份验证才能看到这一点。
如果用户只需要使用您站点的标准HTML登录表单登录,401将不合适,因为它特定于HTTP基本身份验证。
403:此资源存在,但您无权查看它,HTTP基本身份验证也无济于事。
我不建议使用403来拒绝访问/包含之类的内容,因为就web而言,这些资源根本不存在,因此应该使用404。
换句话说,403表示“此资源需要HTTP基本身份验证以外的某种身份验证(例如使用网站的标准HTML登录表单)”。
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2