访问被拒绝:403 还是 404?

Access denied: 403 or 404?

如果有人请求访问不允许他查看的实体,应该 return 编辑什么状态代码?您可能会说它是 403:禁止访问。但是 return 404 是常见的做法吗?我不希望有人知道这个实体存在,如果他不被允许看到的话。你怎么看?

Return403 Forbidden。如果您 return 对于每个请求都不允许客户端访问,并且如果您 never return 404 Not Found,则客户端什么都不知道。

这完全取决于这对您的重要性:

I don't want somebody know that this entity even exists if he is not permitted to see it.

如果这真的很重要,总是 return 403 Forbidden

希望您根据我在下面发布的内容得到一些关于 HTTP 错误的说明:

HTTP 401 错误 :: 当网站访问者试图访问受限网页但未获授权时,会发生此错误。

HTTP 403错误:: 这个错误和401错误类似,但是要注意unauthorized和forbidden的区别。例如,如果您尝试访问任何网站上的目录(禁止访问),就会发生这种情况。

HTTP 404 错误:: 当您尝试访问 Web 服务器上不存在的资源(通常是网页)时会发生 404 错误。

使用 404 未找到。

The 404 status code can also be used in 403 scenarios, when the server does not want to send back the reason why it is refusing to serve the request. A good example is when the server senses some kind of an attack, which might be a brute force attack. In this case, the server responds with a 404 Not found instead of a 403 Forbidden and an explanation.

来源:Pro ASP.NET Web API Security

嗯..这取决于..

如果您的端点的 URL 泄露了敏感信息(例如,在 Dropbox API 中,您通过名称而不是 ID 引用文件 - 因此 URL 包含文件名)或者您可能使用顺序 ID(例如,可以暴力破解的升序 ID),return 404.

如果您需要为您没有权限的资源支持 "Request Access" 功能,return 403,那么您的客户端可以分辨出差异。

一般来说,如果您的 API 使用 ID 并且从不将信息作为其 URL 的一部分透露,并且您使用 UUID 作为 ID,我会选择 403.. 就像许多众所周知的非常现在的安全应用程序(Google、Microsoft 等)。