【问题标题】:Meteor Security Permissions on Uploaded Images上传图片的 Meteor 安全权限
【发布时间】:2020-11-08 13:28:04
【问题描述】:

我正在创建一个 Meteor 聊天应用程序。我希望用户能够相互发送图像,但不在组/对话中的用户不应该能够看到图像。我的第一个想法是给图像一个唯一的 ID,并将具有此 ID 的图像存储在我或第 3 方服务器的公共文件夹中。

例如,如果用户上传一个名为“name.jpg”的图像,它可以作为 A3eedAcRCqCa32451.jpg 存储在 Amazon S3 中。这样,任何拥有该 ID 的人都可以访问该图像,但唯一可以访问该 ID 的人将是群聊中的人,因为我可以使用 Meteor 的发布和订阅规则确保安全访问。但是,这对我来说并不安全。我的直觉对吗?

如果是,我还能怎么做?我在网上和 StackOverflow 上搜索,找不到另一种简单的方法来实现这一点。

【问题讨论】:

    标签: node.js security meteor file-upload


    【解决方案1】:

    这取决于您想要的安全级别...
    更安全的解决方案是将可以访问图像的人的imageIduserId 存储在集合中。当有人想要访问它时,您只需检查他是否在允许的用户列表中。

    然后正如您所说,您可以使用 3rd 方存储(我个人使用 ostrio:files 与 Dropbox 集成,the docs 关于它不是最新的,但我提出了一个拉取请求,该请求被开发人员接受带有工作示例的分支,您可以查看它here。)

    ostrio:files 的好处在于它提供了像 onAfterUploadinterceptDownload 这样的内置函数,您可以在其中存储有关第一个访问的数据并检查是否允许第二个访问。

    【讨论】:

    • interceptDownload 是否会阻止人们直接从图片链接访问图片?
    • @NickTurtle 自己从未尝试过,但理论上是的,它是在图像下载之前调用的,因此未经其批准,图像无法出现。 The docs 说您需要“从此函数返回 false 以继续标准行为”或“返回 true 以拦截传入请求”。因此,您必须检查是否允许用户访问此图像,如果是则返回 false,否则显示您想要的任何错误消息并返回 true。
    • 我想知道它是如何做到的。 Dropbox(或 Amazon S3)是否会联系我的服务器以确定是否将图像发送到客户端?
    • @NickTurtle interceptDownload 在下载请求之后调用,因此在联系 Dropbox/Amazon S3 之前调用。一切都发生在你身边,如果interceptDownload返回false,它将开始与存储提供商联系,如果你返回true,它就会停止,甚至不联系Dropbox/Amazon S3。
    【解决方案2】:

    在考虑授予资源访问权限时,您通常可以做两件事:

    1. 身份验证和访问控制
    2. 具有足够熵的间接对象引用使暴力攻击无望。

    第 1 点或多或少是显而易见的。 第 2 点实际上是您已经想到的。为了推理第二种方法的安全性,让我们考虑以下几点:

    • A3eedAcRCqCa32451.jpg 的熵约为 80 位。
    • 域的计数是 2^80 = 1208925819614629174706176。
    • 攻击者可以尝试猜测秘密。
    • 比方说,他每秒可以猜测 10 次,平均而言,他会在 |domain|/2 次尝试后猜测。
    • 攻击者需要大约 200 万年的时间来猜测。

    从安全角度来看,现在 80 位的域有点小。使用 4 类 UUID 将其设为 128 位。我相信你知道这是怎么回事。

    【讨论】:

    • 我担心的另一件事是是否有某种方法可以列出存储桶中的所有图像,但我看到另一个答案描述了如何在 Amazon S3 上防止它。
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多