【问题标题】:Rails: How to protect images uploaded to S3 using dragonflyRails:如何保护使用蜻蜓上传到 S3 的图像
【发布时间】:2012-01-16 22:34:00
【问题描述】:

我正在寻找一种方法来保护使用蜻蜓 gem 从 Heroku Rails 3 应用上传到 S3 存储的图像。我想在用户基础上控制访问,并确保图像不能被直接访问。

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

【问题讨论】:

    标签: ruby-on-rails heroku amazon-s3 dragonfly-gem


    【解决方案1】:

    Dragonfly 允许 remote_url:expires 选项,它是 S3DataStore 的 url_for 的包装器。见here。像 paperclip 那样设置一个 10 秒后过期的受限下载链接怎么样?

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

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

    【讨论】:

    • 谢谢,我会检查这个选项并返回。
    【解决方案2】:

    由于我目前使用的是路由端点,不幸的是,过期的 url 对我不起作用。

    我发现,设置一个 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
    

    另一种以编程方式对某些图像执行此操作的方法可以通过直接在 Dragonfly 的 Fog 存储实例上调用方法 put_object_acl 来实现,例如在模型回调中:

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

    这当然只有在使用的存储实际上是雾存储时才有效,因此需要进行检查。

    我目前没有对此解决方案进行任何测试,因为它似乎涉及很多模拟。因此,如果有人对此解决方案有意见,我将不胜感激!

    【讨论】:

    • 您好 polarblau - 您如何通过您的应用程序访问此信息?您的应用程序是网页吗?如果是这样,渲染图像需要什么语法?
    • 如前所述,我使用的是 Dragonfly(一个 Ruby gem),在本例中使用的是 Rails。以下是文档:markevans.github.com/dragonfly/file.GeneralUsage.html
    • 嗨 Polarblau - 我是在蜻蜓本身的背景下问这个问题的。您共享了确保 S3 上的图像被标记为私有的代码。在将它们存储为“私人”之后,您如何从最终用户的浏览器访问这些图像?您是在使用服务器端代码来获取图像,然后将它们写在 http 响应中,还是使用更方便的东西?如果你能分享那条信息,那就太好了。我已经扫描了蜻蜓文档,但没有看到类似的内容。
    • 我明白了。好吧,我只是使用标准的蜻蜓方法(例如,@model.image.url 用于全尺寸或@model.image.thumb('250x250>') 用于缩略图)。由于蜻蜓对图像的所有请求都通过服务器,所以一切似乎都像以前一样运行。这对您有帮助吗?
    • 是的,这正是我想要的!谢谢!
    【解决方案3】:

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

    文件必须存储为显然不是世界可读的。

    从 Dragonfly 看来,这似乎很简单:

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

    更多信息在这里:http://markevans.github.com/dragonfly/file.DataStorage.html#S3_datastore

    如果这不起作用,我知道 Paperclip 支持这种行为,因为我过去曾多次使用过它。

    【讨论】:

    • 谢谢,听起来很有趣。我还直接通过路由端点获取图像,这是蜻蜓提供的功能。我得看看我是否也能做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多