2

我已经实现了appengine 文档中提到的通用 blob 服务处理程序。只要您知道该 blob 的密钥字符串,该处理程序就会为您提供任何 blob。我使用它来轻松编写客户端可以用来下载文件的 URL。如果客户端 A 检查 URL 以下载他们的文件并找到他们的 blob 密钥(即1CX2kh468IDYKGcDUiq5c69u8BRXBtKBYcIaJkmSbSa4QY096gGVaYCZJjGZUpDz == str(BlobKey)),他们能否以某种方式对该密钥进行逆向工程并轻松构建另一个可用于下载客户端 B 文件的密钥?或者密钥是否添加了随机组件?

作为参考,有这个关于的注释str(db.Key),这引起了我的问题:

注意:密钥的字符串表示看起来很神秘,但没有加密!它可以转换回原始密钥数据,包括种类和标识符。如果您不想将这些数据暴露给您的用户(并让他们轻松猜测其他实体的密钥),请加密这些字符串或使用其他东西。

我正在创建这样的文件,它没有指定filename参数,所以我认为问题归结为,当没有指定一个时如何create()“选择”一个?filename我想我可以生成一个随机文件名并将其传递到这里,以确保这是安全的。

file_name = files.blobstore.create(mime_type='application/octet-stream')
4

2 回答 2

2

BlobKeys 是不可猜测的。如果用户有一个密钥,那绝不会让他们猜测另一个密钥。与包含完整路径信息的数据存储区密钥不同,BlobKeys 不编码任何此类数据。您可以安全地共享它们,而不会像您描述的那样冒用户进行攻击的风险。

(我找不到这些声明的文档 - 这是基于我的回忆。)

于 2013-06-13T04:33:58.030 回答
1

创建 blob 时分配文件名:

name = .....
file_name = files.blobstore.create(mime_type='application/octet-stream', _blobinfo_uploaded_filename=name)

而且您不需要使用 str(BlobKey)。BlobKey 可以是您的服​​务网址的一部分

于 2013-06-13T10:57:51.437 回答