【问题标题】:Return "correct" error code, or protect privacy?返回“正确”的错误代码,还是保护隐私?
【发布时间】:2009-02-20 04:00:41
【问题描述】:

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

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

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

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

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

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

/adminnotes/user

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

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

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

【问题讨论】:

    标签: security authentication


    【解决方案1】:

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

    【讨论】:

    • @Martin:根据系统的结构,可以确定生成响应的时间。如果时间不多,话题就没有找到。如果出现错误的时间较长,则说明该主题存在,但错误是稍后生成的。
    【解决方案2】:

    我会进行 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

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

    【讨论】:

    • HTTP 错误意味着包含错误消息,而不是重定向到它。对用户来说可能无关紧要,但对机器(例如搜索引擎)来说却很重要。
    【解决方案3】:

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

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

    【讨论】:

    • 这个。与其搞乱 403 和 404,不如干脆做点有用的事,将用户重定向到适当的身份验证方法?
    【解决方案4】:

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

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

    【讨论】:

    • 对于论坛,如果员工主题的标题中有用户名,管理员不希望该特定用户知道他们正在讨论他们。所以,隐私,对于一个人来说。
    【解决方案5】:

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

    【讨论】:

    • 由于它们已被删除,我希望它们返回 404,正如您所说的那样。你怎么知道你必须做什么才能通过管理界面看到它们?可能是网址不同
    【解决方案6】:

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

    【讨论】:

    • 但是,对于软删除的问题,SO 返回 404...但某些人仍然可以访问...
    • babby是怎么形成的,太好了。呵呵。
    【解决方案7】:

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

    在我看来,错误不应该说谎。如果您给出 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) 状态代码。当服务器不希望确切地显示请求被拒绝的原因或没有其他响应适用时,通常使用此状态代码。

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

    【讨论】:

      【解决方案8】:

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

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

      本意是好的,但恐怕你提出的这项政策可能不会如你所愿。

      【讨论】:

        【解决方案9】:

        我的建议是:

        1. 如果 Not Exists_Thread 则返回 404
        2. 如果不是 User_Can_Access_to_this_Thread 则返回 403

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-11
          • 1970-01-01
          • 2016-02-20
          • 1970-01-01
          • 2014-07-31
          • 2021-01-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多