GAE ndb安全问题?

时间:2013-03-26 23:00:13

标签: google-app-engine app-engine-ndb

我有两个模拟用户Jo和Sam以及各自的ID 117138609372751079516和144229817858159123282。

该应用具有以下实体:

class MockEntity(ndb.Model):
    ownerId = ndb.StringProperty(default=users.get_current_user().user_id())

当两者同时登录并且用户第一次保存/放置实体时,属性'ownerId'随机填充 的用户ID:117138609372751079516或144229817858159123282

使用pre_put_hook似乎解决了这个问题:

def _pre_put_hook(self):
    if not self.ownerId:
        self.ownerId = users.get_current_user().user_id()

我已经解决了我的直接问题,但为什么一开始就是这种情况发生的?这已经在开发和生产中进行了测试,由约50名测试人员组成。大约40%的人可以看到不属于他们的实体。

1 个答案:

答案 0 :(得分:5)

问题可能是由于ownerId的默认值仅设置为每个App Engine运行时实例创建类MockEntity第一时间。因此,当新的App Engine实例加载时,第一个用户将设置默认值以将类加载到Python解释器中。

有关Python中的此经典问题,请参阅Gotcha — Mutable default arguments,有关NDB中相同情况的说明,请参阅App Engine NDB Gotcha PickleProperty Default Value