Python 预签名URL和x-amz-acl

Python 预签名URL和x-amz-acl,python,amazon-web-services,amazon-s3,boto,Python,Amazon Web Services,Amazon S3,Boto,我想创建一个所谓的“预签名”URL,用于将特定对象(PUT)上传到AmazonS3存储桶 到目前为止还不错。我正在使用python库创建一个URL,其中包含所有必要的内容(过期、签名等)。URL如下所示: https://.s3.amazonaws.com/?Signature=&Expires=&AWSAccessKeyId=&x-amz acl=公共读取 请注意最后一个参数 据我所知,这至少限制了使用此URL的人将对象上载到特定bucket中的特定密钥,还限制了将在对象上设置为“public

我想创建一个所谓的“预签名”URL,用于将特定对象(PUT)上传到AmazonS3存储桶

到目前为止还不错。我正在使用python库创建一个URL,其中包含所有必要的内容(过期、签名等)。URL如下所示:

https://.s3.amazonaws.com/?Signature=&Expires=&AWSAccessKeyId=&x-amz acl=公共读取

请注意最后一个参数

据我所知,这至少限制了使用此URL的人将对象上载到特定bucket中的特定密钥,还限制了将在对象上设置为“public read”的固定ACL

不过,我的最后一句话完全不正确

事实证明,如果使用此URL,则可以使用x-amz-acl头执行以下操作(与同名的查询字符串参数相反,必须设置该参数才能成功进行签名检查):

  • 将其设置为“公共读取”。对象的权限将由两个条目组成:“read”表示“Everyone”,而“fullcontrol”表示bucket owner。这是意料之中的事
  • 省略x-amz-acl头。对象的权限将与每个bucket的默认权限相同(bucket owner拥有完全控制权)。为什么?
  • 将其设置为“公共读写”。结果与(1)完全相同
  • 将其设置为“已验证读取”。“已验证用户”获得“读取”权限,bucket owner拥有完全控制权
  • 将其设置为“bucket owner read”。结果与(2)完全相同。Bucket owner拥有完全控制权,未定义其他权限
  • 将其设置为“铲斗所有者完全控制”。毫不奇怪,bucket owner将拥有完全控制权
  • 将其设置为不存在的固定ACL名称并获取错误
  • 看来

  • x-amz-acl头不参与签名检查,因为您可以随意更改它,请求就会成功。但是,在签名检查期间,查询字符串参数肯定会被考虑在内
  • x-amz-acl查询字符串参数不会直接影响对象的权限,如中所示,它自己不做任何事情
  • 如果发送x-amz-acl标头,则永远不会删除结果权限
    • 对bucket所有者的限制比默认情况下更严格
    • 对非桶所有者的限制更少
  • 但是,对于非桶所有者来说,它们的限制可能更大。也就是说,如果在查询字符串中指定
    x-amz-acl=public read
    ,则可以将
    x-amz-acl
    头设置为
    authenticated read
    ,而不是公开可读的对象,获取一个只能由经过身份验证的用户读取的对象
  • x-amz-acl QS参数与同名的标头之间的实际关系是什么?有没有一种方法可以限制对对象的权限,即通过
    PUT
    请求上传到所谓的“预签名”URL?

    据我所知(这里我可能是错的),header
    x-amz-acl
    优先于querystring参数——它们的作用是相同的。签名检查期间只考虑querystring参数的原因很简单,因为头不是策略签名检查的一部分


    可能会帮助你;在创建表单以直接上载到S3时,它对我帮助很大。

    似乎您对acl参数使用了错误的名称。根据他们关于签名请求的指南,尝试使用acl:

    如果请求处理子资源,如版本控制、位置、acl、torrent、生命周期或版本ID,则附加子资源、其值(如果有)和问号。注意,如果有多个子资源,子资源必须按子资源名称按字典顺序排序,并用“&”分隔。e、 g.?acl和versionId=值

    构建CanonicalizedResource元素时必须包含的子资源列表包括:acl、生命周期、位置、日志记录、通知、零件号、策略、requestPayment、torrent、uploadId、uploads、versionId、版本控制、版本和网站


    因为你是唯一一个在这个问题上付出了一些努力的人,所以你得到了赏金才是公平的,尽管很不幸,答案对我毫无帮助;我只是想把我在这方面的知识传授给大家。不,你所引用的内容谈到了针对子资源的请求,如cors、acl、lifecycle等。如果我试图创建一个请求,它将允许修改acl,即在特定存储桶上设置的acl,那么这将是相关的。我的问题是关于将对象上载到bucket并在正在上载的对象上指定acl。那是完全不同的。