2012-01-16 58 views
3

我正在寻找一种方法来保护从Heroku Rails 3应用程序使用蜻蜓宝石上传到S3存储的图像。我想以用户为基础控制访问权限,并确保无法直接访问图像。Rails:如何保护使用蜻蜓上传到S3的图像

我发现了其他宝石的一些信息,如回形针,但由于蜻蜓的工作方式有点不同,我不确定处理这种情况的首选方式是什么。

回答

1

由于我目前正在使用路由端点,因此不幸的是,即将过期的网址不适用于我。

我发现,设置一个x-amz-acl头设置权限,工作在我的情况下,由于所有图像完全通过应用和从不直接访问。

# config/initializers/dragonfly.rb 
app = Dragonfly[:images] 

if Rails.env.production? 
    app.datastore.configure do |c| 
    # […] 
    c.storage_headers = {'x-amz-acl' => 'private'} 
    end 
end 

另一种方式来对某些图像这是通过编程可以使用电话直接对蜻蜓的雾存储实例,例如方法put_object_acl实现模型中的回调:

app = Dragonfly[:images] 
app.datastore.storage.put_object_acl 'bucket-name', model.image_uid, 'private' 

课程作业,这只会如果使用存储实际上是一个雾存储,因此将需要检查。

目前我没有任何测试这个解决方案,因为它似乎涉及很多嘲讽。所以,如果有人对此解决方案有所建议,我将非常感激听到!

+0

嗨polarblau - 你如何通过你的应用程序访问这些信息?你的应用程序是一个网页吗?如果是这样,渲染图像需要什么语法? – Tabrez 2012-04-12 06:52:19

+0

如上所述,我使用Dragonfly(一种红宝石),在这种情况下使用Rails。这里是文档:http://markevans.github.com/dragonfly/file.GeneralUsage.html – polarblau 2012-04-12 09:55:55

+0

嗨Polarblau - 我在蜻蜓本身的背景下提出这个问题。您分享了确保S3上的图像被标记为私密的代码。在将它们存储为“私人”之后,如何从最终用户的浏览器访问这些图像?您是使用服务器端代码来获取图像,然后将它们写在http响应中,还是使用更方便的东西?如果您可以分享这些信息,那将会很棒。我扫描了蜻蜓文件,但没有看到类似的东西。 – Tabrez 2012-04-13 13:36:18

2

蜻蜓允许:expires选项remote_url是S3DataStore的url_for的包装。见here。如何设置一个受限制的下载链接,在10秒内到期,与paperclip一样?

您还可以在其URL中为图片添加随机guid,以提供更高的安全性,依据this SO question

不是一个真正的解决方案,只是一些想法。

+0

谢谢,我会检查这个选项并取回。 – polarblau 2012-01-17 06:45:56

1

您可以使用Amazon S3的到期URL。这是一个具有到期时间的签名网址。因此,您将生成URL并将其提供给用户,并由他们在规定的时间内阅读该文件。例如,如果您要在需要安全的页面中加载图像,请将失效时间设置为10秒左右。

文件必须存储为NOT世界可读性显然。

通过观察蜻蜓,这似乎是很简单的:

my_model.attachment.remote_url(:expires => 10.seconds.from_now) 

此处了解详情:http://markevans.github.com/dragonfly/file.DataStorage.html#S3_datastore

如果不工作,我知道,回形针支持这种行为,因为我用它在过去几次。

+0

谢谢,听起来很有趣。我还直接通过路由端点获取图像,这是蜻蜓提供的功能。我必须看看我是否也可以做这项工作。 – polarblau 2012-01-17 06:47:57