【发布时间】:2011-06-18 22:02:13
【问题描述】:
我想通过 rails 应用程序保护我的 s3 文档,这样如果我去:
www.myapp.com/attachment/5 应该在显示/下载文档之前对用户进行身份验证。
我已经阅读过关于 stackoverflow 的类似问题,但我不确定我是否看到了任何好的结论。
根据我的阅读,您可以采取多种措施来“保护”您的 S3 文档。
1) 混淆 URL。我已经做到了。我认为这是一件好事,所以没有人能猜出 URL。例如,如果您的 S3 URL 很明显:https://s3.amazonaws.com/myapp.com/attachments/1/document.doc,则很容易“遍历”该 URL。有一个 URL,例如: https://s3.amazonaws.com/myapp.com/7ca/6ab/c9d/db2/727/f14/document.doc 似乎好多了。 这样做很好,但不能解决通过电子邮件或网站传递 URL 的问题。
2) 使用如下所示的过期 URL:Rails 3, paperclip + S3 - Howto Store for an Instance and Protect Access 然而,对我来说,这不是一个很好的解决方案,因为 URL 是公开的(即使只是很短的时间),另一个用户可能会及时快速地重用 URL。您必须调整时间以允许下载,而不会为复制提供太多时间。这似乎是错误的解决方案。
3) 通过应用代理文件下载。起初我尝试只使用 send_file:http://www.therailsway.com/2009/2/22/file-downloads-done-right 但问题是这些文件只能是您服务器上的静态/本地文件,不能通过其他站点 (S3/AWS) 提供。但是,我可以使用 send_data 并将文档加载到我的应用程序中,然后立即将文档提供给用户。这个解决方案的问题很明显 - 两倍的带宽和两倍的时间(将文档加载到我的应用程序然后返回给用户)。
我正在寻找一种解决方案,它可以提供#3 的完全安全性,但不需要额外的带宽和时间来加载。看起来 Basecamp 正在他们的应用程序背后“保护”文档(通过身份验证),我认为其他网站也在做类似的事情,但我认为他们没有使用我的 #3 解决方案。
我们将不胜感激。
更新:
我选择了第四个解决方案:
4) 使用亚马逊存储桶策略来控制对基于引用者的文件的访问: http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?UsingBucketPolicies.html
再次更新:
#4 可以通过浏览器开发人员的工具轻松解决。所以我仍在寻找可靠的解决方案。
【问题讨论】:
标签: ruby-on-rails security amazon-s3 obfuscation