我正在生成S3预签名URL,以便客户端(移动应用程序)可以直接将图像放到S3中,而不是通过服务。对于我的用例,预签名URL的过期时间需要配置为更长的窗口(10-20分钟)。因此,我想限制文件上传到S3的大小,这样任何恶意攻击者都不能向S3存储桶上传大文件。客户端将从有权访问S3存储桶的服务获取URL。我正在使用AWS Java SDK。
我发现这可以使用POST表单进行浏览器上传,但我如何使用签名的S3 URL PUT来做到这一点?
发布于 2021-09-27 15:27:29
我第一次使用S3-Signed-URLS,也很担心这个问题。我认为这些带签名的Urls有点麻烦,因为你不能对它们设置最大对象/上传大小的限制。
我认为这对于文件上传来说是非常重要的,只是缺少了.
由于没有这个选项,你不得不处理到期时间等问题。这会变得非常混乱。
但是似乎你也可以将S3存储桶用于普通的Post请求,它们的策略中有一个内容长度参数。所以将来我可能会用POST-Routes来交换我的签名URLS。
我认为对于适当的、更大的应用程序来说,这是一条可行的道路。
可能对您的问题有帮助的方法:
在JavaScript软件开发工具包中有一个方法/函数,它只获取S3对象的元数据(包括文件大小),而不下载整个文件。
它被称为s3.headObject()
我认为,在上传完成后,AWS需要一些时间来处理新上传的文件,然后才能在您的存储桶中使用。
我所做的是,我在每次上传后设置一个计时器来检查文件大小,如果它比1mb大,它就会删除文件。我认为对于生产,您应该将其记录在数据库中的某个位置。我的FileNames还包括上传文件的用户id。这样,如果你愿意,你可以在太大的上传后阻止一个帐户。
这在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);
});
});
}https://stackoverflow.com/questions/64211805
复制相似问题