为了账号安全,请及时绑定邮箱和手机立即绑定

AppEngine 的 datastore.Get() 是否不验证所请求密钥的命名空间?

AppEngine 的 datastore.Get() 是否不验证所请求密钥的命名空间?

Go
慕森王 2021-07-09 14:11:25
我在 go-appengine 的数据存储中使用命名空间,大致如下:func getThing() *Thing {  nctx := appengine.Namespace(ctx, "whatever")  thing := Thing{}  key, err := datastore.Get(nctx, key, &thing)  if err != nil {    return nil, err  }  return thing, nil}够简单了吧?不幸的是,如果事实证明如果 nctx 的命名空间与键的命名空间不匹配,它无论如何都会很高兴地获取该对象。AFAICT,没有办法手动获取密钥的“命名空间”字段以手动验证它。这对我们的应用很重要,因为我们有来自 Web 客户端的密钥,在某些极端情况下,这些密钥可能与错误的命名空间相关联。OTOH,如果我使用的键作为祖先进行查询Thing,数据存储(适当地)返回错误,因为祖先的命名空间与上下文(形式query namespace is 'bar' but ancestor namespace is 'foo')的命名空间不匹配。我是否遗漏了一些关于数据存储提取/查询和命名空间的预期约束,或者这听起来像是一个错误?
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我假设您正在传递编码的密钥,而不仅仅是它们的 ID?如果您使用创建键,datastore.NewKey则传递给它的上下文将设置键的命名空间(除非还有父项,在这种情况下将使用命名空间)。

就意图而言,此行为等效于 python API - 在 上设置不同的命名空间时,可以获取从 urlsafe 字符串创建的密钥namespace_mananger,但如果您仅通过指定创建密钥,则使用当前设置的命名空间种类和身份。

不过,为命名空间设置一个 getter 会很好,所以您至少可以在反序列化后进行验证...


查看完整回答
反对 回复 2021-07-19
  • 1 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信