jjzjj

python - 预签名 URL 和 x-amz-acl

coder 2023-08-19 原文

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

到目前为止一切顺利。我正在使用 python 库 boto创建一个包含所有必要内容(过期、签名等)的 URL。网址如下所示:

https://<bucketname>.s3.amazonaws.com/<key>?Signature=<sig>&Expires=<expires>&AWSAccessKeyId=<my key id>&x-amz-acl=public-read

注意最后一个参数。

至少,据我所知,这限制了使用此 URL 的任何人将对象上传到特定存储桶中的特定键,并且还限制了将在对象上设置为“公共(public)读取”的固定 ACL。

虽然我最后的陈述是完全不正确的。

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

  1. 将其设置为“公开阅读”。对象的权限将包含两个条目:“Everyone”的“读取”和存储桶所有者的“完全控制”。这是意料之中的事情。
  2. 省略 x-amz-acl header 。对象的权限将与每个存储桶的默认权限相同(存储桶所有者具有完全控制权)。为什么?
  3. 将其设置为“公共(public)读写”。结果与(1)完全相同。
  4. 将其设置为“已验证读取”。 “经过身份验证的用户”获得“读取”权限,存储桶所有者拥有完全控制权。
  5. 将其设置为“bucket-owner-read”。结果与(2)完全相同。存储桶拥有者拥有完全控制权,未定义其他权限。
  6. 将其设置为“bucket-owner-full-control”。不出所料,存储桶拥有者将拥有完全控制权。
  7. 将它设置为一个不存在的固定 ACL 名称并得到一个错误。

看来是这样

  1. x-amz-acl header 不参与签名校验,因为你可以随意更改,请求成功。但是,在签名检查期间肯定会考虑查询字符串参数。
  2. x-amz-acl 查询字符串参数不会直接影响对象的权限,因为它自己什么都不做。
  3. 如果您发送 x-amz-acl header ,则生成的权限永远不会
    • 对存储桶拥有者的限制比默认情况下更多。
    • 对非 bucket-owner 的限制较少。
  4. 但是,对于非存储桶所有者,它们可以更具限制性。也就是说,如果您指定 x-amz-acl=public-read在查询字符串中,您可以设置 x-amz-acl标题为 authenticated-read而不是公开可读的对象,而是获取一个只能由经过身份验证的用户读取的对象。

x-amz-acl QS 参数和同名 header 之间的真实 关系是什么?有没有办法限制对象的权限,即通过 PUT 上传请求所谓的“预签名”URL?

最佳答案

据我了解(我在这里可能是错的), header x-amz-acl 优先于查询字符串参数——它们的作用相同。在签名检查期间仅考虑查询字符串参数的原因仅仅是因为 header 不是策略签名检查的一部分。

This page可能对你有帮助;在创建直接上传到 S3 的表单时,它对我帮助很大。

关于python - 预签名 URL 和 x-amz-acl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895775/

有关python - 预签名 URL 和 x-amz-acl的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐