代码之家  ›  专栏  ›  技术社区  ›  Jay Godse

如何使amazon s3上托管的图像不那么公开,但又不是完全私有?

  •  14
  • Jay Godse  · 技术社区  · 14 年前

    我启动了一个使用amazon s3进行图像托管的示例应用程序。我设法哄它工作。应用程序托管在 github.com . 应用程序允许您创建带有个人资料照片的用户。上传照片时,web应用程序将其存储在amazon s3上,而不是本地文件系统上。(如果您主持 heroku.com )

    然而,当我在页面浏览器中执行“查看源代码”时,我注意到图片的url是我分配给应用程序的s3 bucket中的amazons3url。我剪切并粘贴了url,并且能够在同一个浏览器中查看图片,在另一个浏览器中,我没有打开到我的web应用程序或amazon s3的会话。

    有没有什么方法可以限制对该url(和图像)的访问,使其仅对登录到我的应用程序中的浏览器可用?

    我发现的关于amazon acl的大多数信息都只涉及所有者或通过amazon或amazons3认证的用户组的访问,或者匿名访问每个人。

    编辑——2010年7月7日更新

    亚马逊有 just announced 限制对s3对象和bucket的访问的更多方法。在其他方法中,您现在可以通过限定http引用来限制对s3对象的访问。这看起来很有趣…我等不及他们更新他们的开发文档了。

    4 回复  |  直到 8 年前
        1
  •  4
  •   yfeldblum    14 年前

    s3是一个独立的服务,不知道您的会话。

    通用的解决方案是认识到为每个资产分配单独、唯一、非常长且随机的密钥的好处和安全属性,这些密钥构成了该资产url的一部分。如果您选择这样做,您甚至可以分配一个具有512个有效随机位的密钥,并且该url将在很长一段时间内不可访问。

    • 因为当时有人 t 拥有对资产的访问权可以简单地复制资产以备将来参考,允许该人随时知道url并访问资产是有意义的。
    • 同样,由于此人可以简单地下载资产并将其分发给其他人,因此允许此人将url分发给其他人(否则他只会将资产本身分发给其他人)是有意义的。
    • 由于所有此类访问都是只读的,并且由于写操作仅限于网站服务器,因此不存在任何具有此访问权限的人恶意“黑客”的风险。

    你必须确定这是否足够安全。如果不是,那么s3可能不适合您,而且您可能需要将图像存储为数据库中的二进制列,并将它们缓存在memcached中,这可以在heroku上实现。

        2
  •  9
  •   davidtbernal    14 年前

    对于隐私真正重要的文件,我们按如下方式处理:

    • 文件存储在私有acl中,这意味着只有授权代理才能下载(或上载)它们
    • 要访问文件,我们链接到 http://myapp.com/download/{s3-path} 在哪里 download 对应于控制器(在mvc意义上)
    • acl是根据需要实现的,因此只有登录的用户才能访问该控制器/操作
    • 该控制器使用api下载文件,然后使用正确的mime类型、缓存头、文件大小等将其流式输出给用户。

    使用这种方法,您最终会使用比所需更多的带宽,但仍然可以节省存储空间。对我们来说,这是可行的,因为我们往往比带宽更快地耗尽存储空间。

    对于只涉及隐私的文件,我们生成一个用于url的随机散列。这基本上是通过晦涩来保证安全性的,而且您必须小心,因为您的散列值很难猜测。

    然而,当我在页面浏览器中执行“查看源代码”时,我注意到图片的url是我分配给应用程序的s3 bucket中的amazons3url。我剪切并粘贴了url,并且能够在同一个浏览器中查看图片,在另一个浏览器中,我没有打开到我的web应用程序或amazon s3的会话。

    请记住,这与存储在文档根目录中其他位置的任何图像没有区别。你可能需要也可能不需要你想要的那种安全感。

        3
  •  6
  •   Alex Soble    10 年前

    亚马逊的ruby sdk( https://github.com/aws/aws-sdk-ruby )有一些有用的方法可以很快完成这项工作。”url_for“可以为其他私有s3对象生成一个临时可读的url。

    以下是如何创建5分钟后过期的可读URL:

    object=aws::s3.new.bucket['bucket'].objects['key']

    对象的url_(:read,:expires=>300)。到

    AWS文件: http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method

        4
  •  1
  •   Chris Peters    8 年前

    我认为你能做的就是drop.io所做的。虽然数据原则上是任何人都可以访问的,但是您给它一个大的随机url。任何知道url的人都可以访问它,但是您的应用程序控制哪些人可以看到url。

    一种默默无闻的安全感。

    您可以将其视为url中包含的密码。这意味着,如果你是认真的安全,你必须把网址作为机密信息。 你必须确保这些链接不会泄露给搜索引擎。

    撤销访问权限也很棘手。唯一能做的就是使一个url无效并分配一个新的url。