代码之家  ›  专栏  ›  技术社区  ›  J. C

为什么cloudfront只在授予列表权限时才返回自定义错误对象?

  •  1
  • J. C  · 技术社区  · 7 年前

    我注意到,如果bucket的list权限没有授予公众,cloudfront的自定义错误页(在我的例子中找不到404)总是返回403 forbidden。一旦授予列表权限,就可以返回自定义404图像。

    我的任何对象都没有显式标记为公共可读。但我已经为bucket中的所有对象授予cloudfront origin identity read权限。所以我假设,当cloudfront试图获取不存在的对象时,它找不到它;然后它试图列出所有对象来查找目标;因此,权限被拒绝。这部分让我困惑。如果目标存在时不需要列表权限,那么为什么cloudfront在第一步找不到原始目标时不直接获取给定的自定义错误对象?列出对象仅仅是为了确认404状态吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Paul    7 年前

    当cloudfront试图在没有列表权限的情况下访问不存在的密钥时,403直接来自s3。cloudfront并没有试图发出第二个请求来列出对象,或者类似的任何请求。当cloudfront试图访问不存在的对象时,s3直接返回403。

    当您试图在没有list权限的情况下访问不存在的密钥时,s3返回403响应而不是404,原因是没有list权限,您应该无法区分这两种情况:

    1. S3键存在,但权限不允许访问该对象
    2. S3密钥不存在

    如果您能够区分这些,那么您可以通过枚举可能的键并检查403和404响应来有效地列出bucket的内容。这在没有列表权限的情况下是不允许的,因此这两个场景必须具有相同的响应才能区分开来。它们可能都是403,也可能都是404,但403更合适,因为它表示“禁止”。如果没有列表权限,“禁止”您知道是否存在具有该键的元素。

    它并不真的适用于你的情况,在你的桶中的所有对象都是可访问的,但是如果你的桶中只有一个对象是秘密的,并且你不想让没有列表许可的人知道它在那里,你会很感激s3没有通过返回403英寸来揭示它的存在。一个特定的网址404的TEAD。s3的规则适用于一般情况,即不能确定bucket中的所有对象都是可访问的,甚至不能确定它们的存在应该是可检测的。