GAE ndb安全问题?

wai*_*ani 2 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())
Run Code Online (Sandbox Code Playgroud)

当两者都在同一时间登录,要么用户保存/放实体首次,物业"OWNERID"随机与填充任何用户的ID:117138609372751079516或144229817858159123282

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

def _pre_put_hook(self):
    if not self.ownerId:
        self.ownerId = users.get_current_user().user_id()
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

请参阅Gotcha - Python中的此经典问题的可变默认参数App Engine NDB Gotcha PickleProperty默认值,以解释NDB中的相同情况.