#python-3.x #django #security #django-models
#python-3.x #django #Безопасность #django-модели
Вопрос:
Я знаю, что django оптимизирует повторное использование некоторых экземпляров модели. Итак, вопрос в том, действительно ли значение ‘imprints’, показанное ниже, всегда уникально для сеанса входа в систему в django?
Допустим, у меня есть развертывание django, в котором используется эта модель.
Class Thing(models.Model):
example_field = models.UUIDField(default=uuid.uuid4, editable=False)
imprints = None # placeholder for imprints to be added dynamically
def add_imprints(self, cc):
"""
Adds an imprints object associated with this instance for passed cc to this
instance.
"""
self.imprints = cc.imprint_set.get(entity=self)
используя ORM, экземпляр этой модели объекта в БД отображается в представлении, скажем, с помощью.
object = Thing.objects.get(pk=thing_id)
затем полю imprints присваивается значение, которое предназначено только как дополнение к экземпляру, чтобы при его передаче другой функции добавленная информация была там — вот так
object.add_imprints(cc)
Чтобы подчеркнуть — значение imprints используется только для передачи информации с экземпляром Thing во время обработки представления и через некоторые связанные функции, нет необходимости в дальнейшем сохранении, и оно должно быть уникальным для сеанса.
Обычно с такой практикой проблем нет, однако здесь может возникнуть проблема безопасности. Мне нужно знать, будет ли django когда-либо использовать тот же экземпляр для другого зарегистрированного пользователя — вместе со значением imprints, с другим сеансом, если они это сделают
object = Thing.objects.get(pk=thing_id)
с тем же thing_id, в то время как другой экземпляр все еще используется.
Ответ №1:
Django создает новый экземпляр модели при получении конкретного объекта запроса.
Вы можете быть уверены, что временные переменные будут только в этом объекте
Вы можете это проверить:
In [13]: from django.contrib.auth.models import User
In [14]: users = User.objects.all()
In [15]: u = users.first()
In [16]: u
Out[16]: <User: super>
In [17]: u.tmp = 123
In [18]: u.tmp
Out[18]: 123
In [19]: u2 = users.first()
In [20]: u2.tmp
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-20-f4c979d08460> in <module>
----> 1 u2.tmp
AttributeError: 'User' object has no attribute 'tmp'