情况:我在网络上运行Django应用,登录用户还可以下载.pdf文件(非公开,有特定限制,具体取决于用户权限)。最方便的方法(例如,在S3中)是使用受时间限制的,预签名的URL,因为它们会立即在浏览器中打开,而且应用服务器不必处理其他流量。
问题:Backblaze B2显然没有提供用于创建预签名URL的显式方法,以直接在浏览器中下载非公共文件。 生成api URL和授权令牌,并从对象存储中提取文件发生在应用程序服务器级别,并且该过程不会向“普通”用户公开。
但是最后,API操作“ b2_download_file_by_name”仅使用GET请求,这意味着我可以使用“?Authorization = 123xyz ........”将授权令牌添加到请求的URL中。这样,我获得了一个预签名URL,该URL在浏览器中可以很好地工作,以允许在有限的时间内访问特定的非公共文件。 (请注意:B2下载可以限制为具有特定前缀的文件(例如s3伪文件夹),但是如果指定的“前缀”足够长,则可以使一个文件具有特定的auth令牌。)
问题:正如我在上面写的,通常授权令牌不会公开给用户。现在,如果我使URL可见,这是否意味着安全风险?换句话说,摆在一个或多个令牌上的用户是否可以从令牌中提取通用访问密钥,或者令牌是否经过充分加密才能避免这种情况?
答案 0 :(得分:1)
根据b2_download_file_by_name调用的文档,您可以按照描述的方式在URL中使用下载授权。
可以在URL查询字符串中提供授权令牌,而不是在HTTP标头中传递授权令牌。从b2_authorize_account获得的帐户授权令牌将允许访问私有存储桶中的所有文件。从b2_get_download_authorization获得的下载授权令牌将允许访问其名称以用于生成下载授权令牌的文件名前缀开头的文件。
但是似乎b2_get_download_authorization调用中设置的到期时间被忽略了,因此生成的URL永不过期,这当然是不安全的。我在B2上有一张与此有关的支持票,所以希望找到解决方案。