我们正在开发一个网络应用程序,其中(除其他功能外)我们的用户可以上传他们的文件。但是,由于存储空间有限,我们无法将这些文件存储在VPS上,因此我们决定使用S3。
主要问题是我们必须确保用户只能访问自己的数据。因此,我们将文件列表保存在数据库中,并将有权访问这些文件的用户列表保留在数据库中。我们的服务器可以轻松决定用户是否有权访问文件。但是如何实际将文件提供给用户呢?
我已经考虑过一些可能性,但是似乎没有一个是最好的。
1.使用PHP生成(过期)签名的URL
这是一种非常简单的方法,它也很快,但是会导致非常丑陋且冗长的网址。
2.混淆的网址
这意味着,我们将文件公开供S3读取,但是所有文件都存储在难以猜测的命名文件夹中,例如:24fa0b8ef0ebb6e99c64be8092d3ede20000
。但是,也许这不是最安全的方法。即使您永远无法猜测文件夹名称,在知道它之后(因为您实际上可以访问它),也可以与任何人(与任何未经授权的人)共享该链接。
3.通过我们的服务器下载文件
这意味着文件不是由S3直接提供的,而是首先由我们的服务器安全地读取并提供。我们真的不想要这个:)
4.检查引荐来源
该混淆后的URL的解决方案可以用“确保”的要求来自于我们的服务器(你可以设置S3检查引荐)得到改善。但是,这将是一个非常不可靠的解决方案,因为并非所有浏览器都会发送引荐来源网址数据,而且该数据也可能是伪造的。
为不同客户端安全地从Amazon S3提供文件的一种好方法是什么?