【发布时间】:2019-09-23 22:37:52
【问题描述】:
我正在尝试为我的应用程序重新上传上传:
- 客户端上传文件到 API
- API 将文件上传到 S3
到
- 客户端从 API 请求预签名 URL
- API 生成并使用 URL 响应
- 客户端上传到 S3
我正在努力解决的一件事是限制可以上传的文件。我们希望允许上传图像和视频,但不允许上传可执行文件等潜在危险文件。我一直在尝试利用存储桶策略来强制执行 $Content-Type 或 video/mp4,但我仍然能够上传图像。以下是我生成 URL 的方式(在本例中为 PHP,主要取自 S3 docs):
$formInputs = ['acl' => 'public-read', 'key' => 'test1.mp4', 'Content-Type' => 'video/mp4'];
$options = [
['acl' => 'public-read'],
['bucket' => $bucket],
['key' => 'test1.mp4'],
['eq', '$Content-Type', 'video/mp4']
];
$expires = '+2 hours';
$postObject = new \Aws\S3\PostObjectV4(
$client,
$bucket,
$formInputs,
$options,
$expires
);
将$postObject->getFormInputs() 插入 Postman 并将图像作为文件发布后,它接受上传。如果我从 S3 请求文件,我可以访问它,但是它会以 Content-Type: video/mp4 返回并且不会在浏览器中播放;但我仍然可以上传似乎没有意义的文件。
似乎这个选项只要求在表单输入中包含该字段(如果我从输入中删除 Content-Type 字段,它会失败)。 Content-Type 标头似乎完全不相关,文件的实际 mime 类型也是如此。如果是这样的话,这条规则对于 POST/PUT 来说似乎毫无用处(对于 GET 来说可能就没那么有用了)。
是否可以在不依赖表单输入中发送的数据的情况下限制允许上传的文件类型?或者我是否需要在我的应用程序或 Lambda 中上传后检查文件并验证它是否正确?
【问题讨论】:
标签: amazon-web-services amazon-s3