3

好的,最好在这里举一个例子来说明我的意思。

想象一个基于 Web 的论坛系统,其中用户身份验证是通过系统知道的某种外部方法完成的。

现在,例如,用户输入他们无权访问的线程的 URL。为此,我应该返回 403(禁止),让用户知道他们应该尝试另一种身份验证方法或 404,而不是让他们知道那里有东西可以访问。

假设我返回 403,当他们访问尚不存在的主题的 URL 时,我是否也应该返回 403?

编辑:上面的例子更像是一个 IRL 的例子。

另一个例子,说我暴露了类似的东西

/adminnotes/user

如果有关于用户的管理员注释。现在,返回 403 会让用户知道有人在谈论他们。404 什么也不说。

但是,如果我要返回 403 - 我可以将其返回给 adminnotes/* - 这将解决该问题。

编辑2:另一个例子。这里的软删除问题返回 404。但是,通过正确的身份验证和访问,您仍然可以看到它们(我想)

4

9 回答 9

5

最重要的是,遵守 HTTP 规范。返回 403 代替 404 并不是一件好事。返回 404 代替 403 可能是可以的(或者不是一个大错误),但我会让软件说出真相。如果用户只知道一个主题的ID,那也没什么。并且他可以尝试定时攻击来确定这个话题是否存在。

于 2008-09-29T06:57:52.383 回答
4

我会进行 307 重定向到 NoSuchPageOrNoPermissions.html,在那里您可以很好地告诉用户他们输入错误的 url 或没有权限。

这不会破坏合规性,也不会发出错误的信息。

如果您非常偏执,您可以在返回重定向之前随机等待,这样时间分析会更加困难。

至于这里所有询问为什么保护目录的人,请尝试这些示例

1. 用户名

假设我们是一个 ISP,我们为每个用户提供一个位于 www.isp.example/home/USERNAME 的网页和 USERNAME@isp.example 的电子邮件地址。如果攻击者进行字典攻击,向 www.isp.example/home/[Random] 发送请求并且可以判断这是否是有效用户名,我们现在可以生成有效电子邮件地址列表以出售给坏人。

2.什么文件夹

Bob 正在竞选公职,他在海报上有一个帐户,并使用他的网站存储个人信息。但他通过将其设为私有文件夹来保护它,他的公共页面位于:www.example.com/Bob,他的秘密文件夹是 www.example.com/Bob/IceCream,他已将此标记为私有,因此任何请求的人都会收到 403。但是 www.example.com/Bob/Cake 返回 404,因为 Bobs 的秘密是冰淇淋而不是蛋糕。

记者爱丽丝对 Bobs 网站进行字典攻击

  • www.example.com/Bob/Cake - 404
  • www.example.com/Bob/Donuts - 404
  • www.example.com/Bob/Lollies - 404
  • www.example.com/Bob/IceCream - 403

现在爱丽丝知道鲍勃的秘密,并且可以诋毁他是一个吃冰淇淋的人。

于 2008-10-02T15:48:12.257 回答
3

我认为您应该发送 307(临时重定向)请求“/adminnotes/user”以将非特权客户端重定向到“/adminnotes/”。所以客户端请求“/adminnotes/”,因此你可以发回403,因为它是被禁止的。

这样,您的应用程序将保持 HTTP 兼容,并且非特权用户不会了解太多有关受保护数据的信息。

于 2008-09-29T15:38:46.953 回答
2

通过向用户隐藏特定线程的存在来保护什么“隐私”?

我想说在他们无法访问的线程上返回 403 或 404 是可以的。在不存在的线程上返回 403 是个主意。

于 2008-09-29T06:56:43.480 回答
1

世界上没有一个网站按照你的建议做,所以通过这个例子我们看到最好遵循标准,当资源不存在时返回 404,当资源被禁止时返回 403。

于 2008-09-29T06:53:56.467 回答
1

我不明白您为什么担心 URL 的隐私问题。在 stackoverflow 的情况下,您可以在 QuestionID 编号之后放置任何文本。例如,返回“正确”的错误代码,还是保护隐私?仍然回到这个问题。

于 2008-09-29T07:14:10.660 回答
1

不要忘记 404 在技术上也可以泄露信息。例如,您可以分辨出谁没有 adminnotes。根据具体情况,这可能与表明资源确实存在一样糟糕。

在我看来,错误不应该说谎。如果您给出 404,则应该始终是资源不存在的情况。

如果您正在处理敏感信息,那么您总是可以说用户没有对该资源的权限。这不一定要求资源存在。客户端甚至可能无权知道资源是否存在。因此,您需要为 /adminnotes/ 的任何组合提供权限被拒绝错误。

也就是说,官方规范似乎不同意,这是官方 rfc 关于http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html错误的说法:

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

10.4.5 404 Not Found The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.

I'm no expert, but I think it's crappy to give a "not found", when a resource may exist. I'd prefer a "forbidden", without a guarantee that the resource exists, implying that you would need to authenticate somehow in order to find out.

于 2008-11-16T04:50:16.070 回答
0

假设当您检测到用户没有正确的访问权限时,您确实返回了“找不到页面”错误。一个具有黑客攻击意图的恶意人员很快就会发现您将返回它来代替拒绝访问。

但是,真正的用户输入错误的网址或使用错误的登录等会感到困惑,并且需要不停地解释和发布说明来向客户、TAC 等解释您的立场。以换取什么?

意图是好的,但我担心你提出的这个政策可能不会如你所愿。

于 2008-09-29T07:09:44.367 回答
0

我的建议是:

  1. 如果 Not Exists_Thread 则返回 404
  2. 如果不是 User_Can_Access_to_this_Thread 则返回 403
于 2008-09-29T07:10:00.903 回答