为多个客户端安全地存储和提供文件

Tam*_*Pap 8 amazon-s3

我们正在开发一个网络应用程序,其中(除其他功能外)我们的用户可以上传他们的文件。但是我们无法将这些文件存储在我们的 VPS 上,因为存储空间有限,所以我们决定使用 S3。

主要问题是我们必须确保用户只能访问他们自己的数据。所以我们将文件列表保存在我们的数据库中,以及可以访问它们的用户列表。我们的服务器可以轻松决定用户是否可以访问文件。但是如何将文件实际提供给用户呢?

我已经考虑了一些可能性,但实际上它们似乎都不是最好的。

1. 用 PHP 生成(过期)签名的 url

这是一个非常简单的方法,它也很快,但会产生非常丑陋和长的 url。

这是如何做到的

2. 混淆的 URL

这意味着,我们将文件公开以供在 S3 上读取,但所有文件都存储在难以猜测的命名文件夹中,例如:24fa0b8ef0ebb6e99c64be8092d3ede20000. 然而,也许这不是最安全的方式。即使您永远猜不到文件夹名称,在您知道它之后(因为您实际上可以访问它),您也可以与任何人(与任何未经授权的人)共享该链接。

3.通过我们的服务器下载文件

这意味着文件不是由 S3 直接提供的,但首先我们的服务器安全地读取它并提供它。我们真的不想要这个:)

4. 检查推荐人

混淆后的URL的解决方案可以用“确保”的要求来自于我们的服务器(你可以设置S3检查引荐)得到改善。然而,这将是一个非常不可靠的解决方案,因为并非所有浏览器都会发送引用数据,而且它也可能被伪造。

为不同的客户端安全地从 Amazon S3 提供文件的好方法是什么?

vor*_*aq7 12

这对你来说真的是“做我的系统架构”,但你的四个想法是变量安全性的有趣案例研究,所以让我们运行你的选项,看看它们的表现:


4. 检查推荐人

推荐人由客户提供。信任客户端提供的身份验证/授权数据几乎会使安全性失效(我只能声称是从您希望我来自的地方发送的)。
判决: TERRIBAD想法 - 微不足道的绕过。


3.通过我们的服务器下载文件

不错的主意,只要您愿意花费带宽来实现它,并且您的服务器是可靠的。
假设您已经解决了普通服务器/应用程序的安全问题,这是您提供的选项中最安全的。
结论:很好的解决方案。非常安全,但如果带宽是一个因素,则可能不是最佳选择。


2. 混淆的 URL

默默无闻的安全?真的吗?不,
我什至不打算分析它。就是不行。
结论:如果#4 是TERRIBAD,这是TERRIWORSE,因为人们甚至不必通过伪造引用标题的努力。猜串并赢取所有数据的奖品


1. 用 PHP 生成(过期)签名的 url

这个选项有一个相当低的吸商。
任何人都可以点击 URL 并窃取数据,这是一个安全禁忌,但您可以通过使链接过期来缓解这种情况(只要链接寿命足够短,漏洞窗口很小)。
URL 过期可能会给一些想要长时间停留在下载链接上,或者没有及时获取链接的用户带来不便——这有点用户体验糟糕,但它可能是值得的.
结论:不如#3,但如果带宽是一个主要问题,它肯定比#4 或#2 好。


我会怎么做?

鉴于这些选项,我会选择 #3 -- 通过您自己的前端服务器传递文件,并以您的应用程序通常的方式进行身份验证。假设您的正常安全性相当不错,这是从安全角度来看的最佳选择。
是的,这意味着在您的服务器上使用更多的带宽,以及更多的资源扮演中间人——但您总是可以为此收取更多的费用。