首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用预签名URL限制S3 PUT文件大小

使用预签名URL限制S3 PUT文件大小
EN

Stack Overflow用户
提问于 2020-10-05 23:36:35
回答 1查看 127关注 0票数 0

我正在生成S3预签名URL,以便客户端(移动应用程序)可以直接将图像放到S3中,而不是通过服务。对于我的用例,预签名URL的过期时间需要配置为更长的窗口(10-20分钟)。因此,我想限制文件上传到S3的大小,这样任何恶意攻击者都不能向S3存储桶上传大文件。客户端将从有权访问S3存储桶的服务获取URL。我正在使用AWS Java SDK。

我发现这可以使用POST表单进行浏览器上传,但我如何使用签名的S3 URL PUT来做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2021-09-27 15:27:29

我第一次使用S3-Signed-URLS,也很担心这个问题。我认为这些带签名的Urls有点麻烦,因为你不能对它们设置最大对象/上传大小的限制。

我认为这对于文件上传来说是非常重要的,只是缺少了.

由于没有这个选项,你不得不处理到期时间等问题。这会变得非常混乱。

但是似乎你也可以将S3存储桶用于普通的Post请求,它们的策略中有一个内容长度参数。所以将来我可能会用POST-Routes来交换我的签名URLS。

我认为对于适当的、更大的应用程序来说,这是一条可行的道路。

可能对您的问题有帮助的方法:

在JavaScript软件开发工具包中有一个方法/函数,它只获取S3对象的元数据(包括文件大小),而不下载整个文件。

它被称为s3.headObject()

我认为,在上传完成后,AWS需要一些时间来处理新上传的文件,然后才能在您的存储桶中使用。

我所做的是,我在每次上传后设置一个计时器来检查文件大小,如果它比1mb大,它就会删除文件。我认为对于生产,您应该将其记录在数据库中的某个位置。我的FileNames还包括上传文件的用户id。这样,如果你愿意,你可以在太大的上传后阻止一个帐户。

这在javascript中对我很有效..

代码语言:javascript
复制
function checkS3(key) {
  return new Promise((resolve, reject) => {
    s3.headObject(headParams, (err, metadata) => {
      console.log("setTimeout upload Url");
      if (err && ["NotFound", "Forbidden"].indexOf(err.code) > -1) {
        // console.log(err);
        return reject(err);
        //return resolve();
      } else if (err) {
        const e = Object.assign({}, Errors.SOMETHING_WRONG, { err });
        // console.log(e);
        // console.log(err);
        return reject(e);
      }
      return resolve(metadata);
    });
  });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64211805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档