我们在我们的网站上使用 Amazon S3 处理图像,用户通过我们的网站将图像/文件直接上传到 S3。在我们的策略文件中,我们确保它“以”“上传/”开头。任何人都可以看到这些图像的完整网址,因为它们在上传后是公开可读的图像。黑客可以进来并使用 javascript 中的策略数据和图像的 url 用他们的数据覆盖这些图像吗?上传一次后,我认为无法防止覆盖。我见过的唯一解决方案是将文件复制/重命名到不可公开写入但需要下载图像然后再次将其上传到 S3 的文件夹中(因为亚马逊无法真正重命名)
3 回答
如果我理解正确图像通过您的服务器应用程序上传到 Amazon S3 存储。因此 Amazon S3 写入权限只有您的应用程序。客户端可以上传图片,只扔你的应用程序(将它们存储在 S3 上)。黑客只能强制你的应用上传同名图片并重写原始图片。
当用户上传名称已存在于您的 S3 存储中的图像时,您如何处理这种情况?考虑以下操作:
- 第一个用户上传图片some-name.jpg
- 您的应用将该图像存储在 S3 中,名称为upload-some-name.jpg
- 第二个用户上传图片some-name.jpg
- 您的应用程序会覆盖存储在 S3 中的原始应用程序吗?
我认为这个问题意味着内容使用服务器提供的策略文件直接从浏览器进入 S3。如果该策略文件设置了过期时间,例如,在未来的某一天,则该策略在此之后将变为无效。此外,您可以在可写路径上设置起始条件。
因此,黑客可以使用您的策略文件恶意覆盖文件的唯一方法是获取新的策略文件,然后仅覆盖指定路径中的文件。但是到那时,您将有机会拒绝提供策略文件,因为我认为这是在验证您的用户之后发生的事情。
所以简而言之,如果您在分发正确构建的策略文件并在这样做之前对用户进行身份验证,我认为这里没有危险。不需要复制东西。
实际上 S3 确实有一个很好用的复制功能
但正如上面的amra所说,通过复制来增加你的空间听起来效率低下
mybe它会更好地为对象提供某种独特的ID,如guid并设置以“x-amz-meta-”开头的其他用户元数据以获取更多信息对象,例如上传它的用户、显示名称等...
另一方面,您始终可以检查密钥是否已经存在并提示错误