返回“正确”的错误代码,或保护隐私?

时间:2008-09-29 06:51:02

标签: security authentication

好的,最好在这里举例说明我的意思。

想象一下基于网络的论坛系统,用户身份验证是通过系统知道的一些外部方法完成的。

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

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

编辑:上面的示例更多的是IRL的例子。

另一个例子,说我暴露了像

这样的东西
/adminnotes/user

如果有关于该用户的管理员注释。现在,返回403会让用户知道有关于他们的内容。 404会说什么。

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

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

9 个答案:

答案 0 :(得分:5)

最重要的是,符合HTTP规范。返回403代替404并不是一件好事。返回404代替403可能是好的(或者不是一个大错误),但我只是让软件说实话。如果用户只知道主题的ID,那么反正意义不大。他可以尝试计时攻击来确定这个主题是否存在。

答案 1 :(得分:4)

我会转向307重定向到NoSuchPageOrNoPermissions.html,在那里你很好地告诉用户他们错误输入了网址或者没有权限。

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

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

至于所有人在这里问为什么保护目录试试这些例子

1。用户名

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

2。什么文件夹

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

Alice记者对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

现在爱丽丝知道Bobs的秘密,并且可以诋毁他作为一个冰淇淋食者。

答案 2 :(得分:3)

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

这样您的应用程序就可以保持HTTP兼容,而没有特权的用户将无法了解受保护的数据。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

世界上没有任何网站能够提供您所建议的内容,因此通过此示例,我们发现最好遵循标准并在资源不存在时返回404,而在禁止时则返回403.

答案 5 :(得分:1)

我不明白为什么你担心URL的隐私问题。在stackoverflow的情况下,您可以在QuestionID号后面放置任何文本。例如,Return "correct" error code, or protect privacy?仍然会回到这个问题。

答案 6 :(得分:1)

不要忘记,404技术上也可以透露信息。例如,您可以告诉谁没有管理员。根据具体情况,这可能与指示资源确实存在一样糟糕。

在我看来,错误不应该是谎言。如果你给出404,那么资源就不应该存在。

如果您正在处理敏感信息,那么您可以随时说该用户没有该资源的权限。这不一定要求资源存在。客户可能无权知道资源是否存在。因此,您需要为/ adminnotes /.

的任意组合提供权限被拒绝错误

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

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

10.4.5 404未找到 服务器未找到与Request-URI匹配的任何内容。没有说明该病症是暂时的还是永久性的。如果服务器通过一些内部可配置的机制知道旧资源永久不可用且没有转发地址,则应该使用410(Gone)状态代码。当服务器不希望明确拒绝请求的原因,或者没有其他响应适用时,通常会使用此状态代码。

我不是专家,但我认为当资源可能存在时,给出“未找到”是很糟糕的。我更喜欢“禁止”,不保证资源存在,这意味着你需要以某种方式进行身份验证才能找到答案。

答案 7 :(得分:0)

假设您在检测到用户没有正确的访问权限时确实返回了“找不到页面”错误。一个有黑客攻击意图的恶意攻击者很快就会发现你会拒绝接受访问权限。

但是错误输入网址或使用错误登录等的真实用户会感到困惑,并且不会结束解释和发布说明来向客户解释您的位置,TAC等。换取什么?

目的很好,但我担心你提出的这个政策可能不会按照你想要的方式解决。

答案 8 :(得分:0)

我的建议是:

  1. 如果Not Exists_Thread则返回404
  2. 如果不是User_Can_Access_to_this_Thread则返回403
相关问题