预先提出问题:
据我所知,allocate_ids将保留一个id块,数据存储区不会将其用于新实体创建或其他allocate_ids调用。这是对的吗?
如果是这样,未使用的已分配ID会被重复使用吗?如果是这样,超时时间是多少?
如果从未重复使用未使用的已分配ID,我是否可能会失去ID?是否有任何其他不利影响(即ids变得过大)。
背景:
我正在尝试创建一个系统来防止通过REST API创建重复的对象。 我在创建初始表单时调用allocate_ids,并在表单中嵌入id。 将表单提交到REST API时,它会创建具有嵌入式ID的对象。如果提交两次相同的表单,我将知道不要创建重复的对象。
表单可能会被多次查看而不会被提交,在这种情况下,我可能会浪费大量的ID,而我从不创建实体。这个计划有什么问题吗?
答案 0 :(得分:1)
您的系统很容易被黑客攻击,有人可以手动更改ID的值,它将覆盖现有实体。 创建新对象时,只需发布数据并让AppEngine为您生成和id。
allocate_id在64位空间(至少)工作,所以即使你每秒生成10个ID,也需要几千年的时间才能用完它们。
答案 1 :(得分:1)
几个问题:
不要将数据存储区ID公开给客户端。正如@Shay所指出的,这是一种安全风险,因为用户可以直接操纵数据。
重复表单提交的问题基本上是应用程序工作流程的问题。要解决这个问题,我更喜欢客户端解决方案(javascript),但如果你坚持使用服务器端解决方案,那么请使用sessions。创建一个虚假ID,将其保存在会话中,并将其设置为表单中的隐藏字段。提交表单时,请检查此字段。