【问题标题】:What are valid S3 key names that can be accessed via the S3 rest API?可以通过 S3 REST API 访问的有效 S3 密钥名称是什么?
【发布时间】:2011-10-30 07:05:03
【问题描述】:

根据 AWS 文档,我了解到:

  • S3 键名可以是任何 UNICODE 名称
  • 使用 GET OBJ 时,我需要对密钥名称进行 URL 编码才能访问它。

但是,这些规则似乎过于宽松。

例如,如果我创建了一个名为“../../d”的密钥,当我尝试使用 GET OBJECT API 访问它时会出现 400 错误。有趣的是,我访问 '../d' 没有问题。

是否有文件说明什么是合法的,什么是不合法的?

【问题讨论】:

    标签: amazon-s3


    【解决方案1】:

    亚马逊提供的唯一限制是(在他们的Technical FAQ 上可以找到):

    存储桶或对象名称中允许使用哪些字符?
    密钥是 Unicode 字符序列,其 UTF-8 编码长度最多为 1024 个字节。

    其他限制适用于存储桶(参见其Bucket Restrictions and Limitations 常见问题的存储桶命名规则部分):

    在除美国标准区域外的所有区域中,存储桶名称必须符合 遵循规则。这些会产生一个符合 DNS 的存储桶名称。

    • 存储桶名称的长度必须至少为 3 且不超过 63 个字符
    • 存储桶名称必须是一系列一个或多个标签,以句点 (.) 分隔,其中每个标签:
      • 必须以小写字母或数字开头
      • 必须以小写字母或数字结尾
      • 可以包含小写字母、数字和破折号
    • 存储桶名称不得格式化为 IP 地址(例如 192.168.5.4)

    美国标准区域适用的许可限制较少。请参阅常见问题解答以获取更多信息 信息和一些例子。希望对您有所帮助!

    【讨论】:

    • 我担心对对象(键)名称的无证限制。亚马逊声称任何 unicode 都有效,但显然 '../../word' 没有。我想知道还有什么不支持...
    • 看起来答案是“不,没有文档”。我建议您在 AWS 论坛上提问。在旁注中,这是一个类似的问题(和答案:)):stackoverflow.com/questions/3146380/…
    • @Downvoter:最好有反馈,说明您认为答案没有解决问题的原因。或者更好的是,对答案进行编辑。
    • [ 会让你伤心(因为我花了过去 2 小时进行故障排除)
    • 这里是如何编码那些讨厌的字符stackoverflow.com/questions/62818659/…
    【解决方案2】:

    根据AWS S3 documentation

    虽然您可以在对象键名中使用任何 UTF-8 字符,但以下键命名最佳做法有助于确保与其他应用程序的最大兼容性。每个应用程序可能会以不同的方式解析特殊字符。以下指南可帮助您最大限度地遵守 DNS、网络安全字符、XML 解析器和其他 API。

    请在下面找到

    来自AWS S3 official documentation 的对象键命名指南


    安全字符

    以下字符集通常是安全的,可用于键名:

    • 字母数字字符:0-9 a-z A-Z
    • 特殊字符:! - _ 。 * ' ( )

    关于分隔符(“/”)的说明

    以下是有效对象键名的示例:

    • 4my-组织

    • my.great_photos-2014/jan/myvacation.jpg

    • videos/2014/birthday/video1.wmv

    请注意,Amazon S3 数据模型是一个扁平结构:您创建一个存储桶,存储桶存储对象。没有子桶或子文件夹的层次结构;但是,您可以像 Amazon S3 控制台那样使用键名前缀和分隔符来推断逻辑层次结构。

    例如,如果您使用 Private/taxdocument.pdf 作为密钥,它将创建 Private 文件夹,其中包含 taxdocument.pdf .

    Amazon S3 支持存储桶和对象,Amazon S3 中没有层次结构。但是,对象键名称中的前缀和分隔符使 Amazon S3 控制台和 AWS 开发工具包能够推断层次结构并引入文件夹的概念。


    可能需要特殊处理的字符

    键名中的以下字符可能需要额外的代码处理,并且可能需要进行 URL 编码或引用为 HEX。其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理:

    • 与号(“&”)
    • 'At' 符号 ("@")
    • 冒号(“:”)
    • 逗号 (",")
    • 美元(“$”)
    • 等于 ("=")
    • 加号(“+”)
    • 问号(“?”)
    • ASCII 字符范围 00–1F 十六进制(0–31 十进制)和 7F(127 十进制)。
    • 分号(“;”)
    • 空格 - 在某些用途(尤其是多个空格)中可能会丢失重要的空格序列

    要避免的字符

    您应该避免在键名中使用以下字符,因为要在所有应用程序中进行重要的特殊处理以保持一致性。

    • 反斜杠 ("")
    • 插入符号(“^”)
    • 重音/反引号(“`”)
    • “大于”符号 (">")
    • “小于”符号 ("
    • 左大括号(“{”)
    • 右大括号 ("}")
    • 右方括号 ("]")
    • 左方括号(“[”)
    • “磅”字符(“#”)
    • 不可打印的 ASCII 字符(128–255 个十进制字符)
    • 百分比字符(“%”)
    • 引号
    • 波浪号(“~”)
    • 垂直条/管(“|”)

    【讨论】:

    • 我有一个场景,我将接收密钥作为 API 的参数以下载该文件。我想知道我的api是否可以以某种方式接收密钥(abc/def/filename.png)作为路径参数
    • 听取有关避免使用某些字符的建议的一个重要原因是,各种语言的 AWS 开发工具包都使用 XML 库,但并不总是正确。 python SDK 没有按照这些引号中的描述统一 URL 编码,所以你必须避免 illegal XML characters
    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2016-10-19
    • 2016-01-16
    相关资源
    最近更新 更多