我启动了一个使用Amazon S3进行图像托管的示例应用程序。我设法哄它上班。该应用程序托管在github.com。该应用程序允许您使用个人资料照片创建用户。上传照片时,Web应用程序将其存储在Amazon S3而不是本地文件系统上。 (如果你主持heroku.com)
非常重要然而,当我在页面的浏览器中执行“查看源”时,我注意到图片的URL是我分配给应用程序的S3存储桶中的Amazon S3 URL。我削减&粘贴了URL,并且能够在同一个浏览器中查看图片,并且在另一个浏览器中,我没有打开会话到我的网络应用程序或亚马逊S3。
是否有任何方法可以限制对该URL(和图像)的访问,以便只有登录到我的应用程序的浏览器才能访问它?
我发现的有关亚马逊ACL的大多数信息仅涉及仅对所有者或使用亚马逊或AmazonS3进行身份验证的用户组或匿名访问者的访问权限。
编辑----更新2010年7月7日
亚马逊有{{}}种更多限制访问S3对象和存储桶的方法。除了其他方法之外,您现在可以通过限定HTTP引用来限制对S3对象的访问。这看起来很有趣......我不能等到他们更新他们的开发者文档。
答案 0 :(得分:9)
对于隐私真正重要的文件,我们按如下方式处理:
http://myapp.com/download/{s3-path}
,其中download
对应于控制器(在MVC意义上)使用此方法,您最终会使用比您需要的更多带宽,但您仍然可以节省存储空间。对我们来说,这是有效的,因为我们倾向于以比带宽更快的速度耗尽存储空间。
对于隐私只是重要的文件,我们生成一个随机哈希,我们将其用于URL。这基本上是通过默默无闻的安全性,你必须要小心你的哈希很难猜测。
然而,当我在页面的浏览器中执行“查看源”时,我注意到图片的URL是我分配给应用程序的S3存储桶中的Amazon S3 URL。我削减&粘贴了URL,并且能够在同一浏览器中查看图片,并且在另一个浏览器中,我没有打开到我的网络应用程序或Amazon S3的会话。
请记住,这与存储在文档根目录中其他位置的任何图像没有什么不同。您可能需要或可能不需要您正在寻找的那种安全性。
答案 1 :(得分:6)
亚马逊的Ruby SDK(https://github.com/aws/aws-sdk-ruby)提供了有用的方法,可以轻松完成。 “url_for”可以为其他私有S3对象生成临时可读URL。
以下是如何创建一个在5分钟后过期的可读URL:
object = AWS :: S3.new.buckets ['BUCKET']。objects ['KEY']
object.url_for(:read,:expires => 300).to_s
AWS文档: http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method
答案 2 :(得分:4)
S3是一项单独的服务,不了解您的会话。
通用解决方案是识别为每个资产分配一个单独的,唯一的,非常长且随机的密钥的好处和安全属性,该密钥构成该资产的URL的一部分。如果您这样选择,您甚至可以指定一个具有512个有效位随机性的密钥,并且该URL在很长一段时间内仍然是不可思议的。
t
有权访问资产的人可以复制资产以供将来参考,所以允许该人知道该网址并随时访问该资产是有意义的。您必须确定这是否足够安全。如果不是,则可能S3不适合您,也许您需要将图像存储为数据库中的二进制列,并将它们缓存在memcached中,您可以在Heroku上执行。
答案 3 :(得分:1)
我认为你能做的最好就是drop.io。虽然数据原则上可供任何人访问,但您可以为其提供一个大而随机的URL。知道URL的任何人都可以访问它,但您的应用程序会控制谁可以访问该URL。
通过默默无闻的安全。
您可以将其视为URL中包含的密码。这意味着如果您认真对待安全性,则必须将URL视为机密信息。 您必须确保这些链接也不会泄露给搜索引擎。
撤销访问权限也很棘手。您唯一能做的就是使URL无效并分配一个新的URL。