3

情况:我在网络上运行一个 Django 应用程序,登录用户也可以在其中下载 .pdf 文件(非公开,有特定限制,取决于用户权限)。最方便的方法(例如在 S3 中)是使用有时间限制的预签名 URL,因为它们会立即在浏览器中打开,而且应用服务器不必处理额外的流量。

问题:Backblaze B2 显然没有提供一个明确的方法来创建预签名 URL 以直接在浏览器中下载非公共文件。生成 api URL 和授权令牌,并从对象存储中获取文件发生在应用服务器级别,并且该过程不会暴露给“普通”用户。

但最后,API 操作“b2_download_file_by_name”只使用了一个 GET 请求,这意味着我可以使用“?Authorization=123xyz........”将授权令牌添加到请求的 URL 中。通过这种方式,我获得了一个在浏览器中运行良好的预签名 URL,以允许在有限的时间内访问特定的非公共文件。(请注意:B2 下载可以限制为具有特定前缀的文件 [如 s3 伪文件夹],但如果指定的“前缀”足够长,我可以使身份验证令牌特定于一个文件。)

问题:正如我上面写的,通常授权令牌不会暴露给用户。现在,如果我让 URL 可见,这是否意味着安全风险?换句话说,拥有一个或多个令牌的用户是否可以从令牌中提取通用访问密钥,或者令牌是否加密得足以避免这种情况?

4

1 回答 1

4

根据 b2_download_file_by_name 调用的文档,您可以按照您描述的方式在 URL 中使用下载授权。

可以在 URL 查询字符串中提供授权令牌,而不是在 HTTP 标头中传递。从 b2_authorize_account 获得的帐户授权令牌将允许访问私有存储桶中的所有文件。从 b2_get_download_authorization 获得的下载授权令牌将允许访问其名称以用于生成下载授权令牌的文件名前缀开头的文件。

但是,似乎 b2_get_download_authorization 调用中设置的到期时间被忽略了,因此生成的 URL 永不过期,这当然是不安全的。我与 B2 有一张关于此问题的支持票,因此希望能找到解决方案。

于 2019-01-24T10:05:22.703 回答