【发布时间】:2021-12-30 06:50:03
【问题描述】:
我想在基于公共令牌的 API 中向某些实体提供匿名 ID。
有什么理由我不应该为此使用实体键的 urlsafe 字符串,因为它们已经匿名(至少在我的情况下,我没有使用自己的数据来构造键?
只要我没有将密钥交给任何人,Google App Engine 和 Datastore 就被认为是安全的,对吧?
谢谢。
【问题讨论】:
标签: api google-app-engine google-cloud-datastore
我想在基于公共令牌的 API 中向某些实体提供匿名 ID。
有什么理由我不应该为此使用实体键的 urlsafe 字符串,因为它们已经匿名(至少在我的情况下,我没有使用自己的数据来构造键?
只要我没有将密钥交给任何人,Google App Engine 和 Datastore 就被认为是安全的,对吧?
谢谢。
【问题讨论】:
标签: api google-app-engine google-cloud-datastore
其中一个documentations 说......urlsafe 关键字参数使用 websafe-base64 编码的序列化引用但最好将其视为不透明唯一字符串....当你说它是匿名的时候,我认为这就是你所指的
但是随后的documentation 说......密钥的字符串表示看起来很神秘,但没有加密! 可以将其转换回原始密钥数据,包括种类和标识符。如果您不想将这些数据暴露给您的用户(并让他们轻松猜测其他实体的密钥),那么请加密这些字符串或使用其他东西......
【讨论】:
您可以通过base64 自己解码密钥 - 通常泄露它没有风险。
巨大的风险在于将 urlsafe 实体键作为参数并使用它们从数据存储中读取。攻击者可以欺骗您的应用程序从您的数据存储项目中读取任意数据。据我所知,这是没有任何记录的。
因此,基本上,任何变体都不能在 Web 服务器中使用:
def get(params):
data = datastore.get(urlsavedeccode(params.key))
return data
从外部提供的任何密钥都不应与数据存储一起使用,因为您不能确定您正在阅读您期望的 kind / 路径。这与SQL injection的风险范围基本相同。
【讨论】: