我已经实现了appengine docs中提到的通用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')
没有指定?我想我可以生成一个随机文件名并将其传递到这里,以确保它是安全的。
{{1}}
答案 0 :(得分:2)
BlobKeys是不可猜测的。如果用户有一个密钥,则决不会让他们猜出另一个密钥。与包含完整路径信息的数据存储区密钥不同,BlobKeys不会对任何此类数据进行编码。您可以安全地共享它们,而不会有用户进行攻击的风险。
(我无法找到这些声明的文档 - 这是基于我的回忆。)
答案 1 :(得分:1)
创建blob时指定文件名:
name = .....
file_name = files.blobstore.create(mime_type='application/octet-stream', _blobinfo_uploaded_filename=name)
你不需要使用str(BlobKey)。 BlobKey可以是您服务网址的一部分