Является ли это «безопасным» или нет, зависит от того, что вы подразумеваете под этим, и от того, как вы реализуете свое приложение. Давайте немного отступим и посмотрим, что именно хранится в объекте Key. Возьмите ключ, перейдите к shell.appspot.com
и введите следующее:
db.Key(your_key)
это возвращает что-то вроде следующего:
datastore_types.Key.from_path(u'TestKind', 1234, _app=u'shell')
Как видите, ключ содержит идентификатор приложения, имя типа и идентификатор или имя (вместе с парами вид / идентификатор любых родительских объектов - в данном случае ни одного). Ничего здесь, вы не должны быть особенно обеспокоены сокрытием, поэтому здесь не должно быть никакого существенного риска утечки информации.
В качестве проблемы вы упоминаете, что пользователи могут угадывать другие URL-адреса - это, безусловно, возможно, поскольку они могут декодировать ключ, изменять идентификатор или имя и перекодировать ключ. Однако, если ваша модель безопасности полагается на них , а не , угадывая другие URL-адреса, вы, возможно, захотите сделать одну из следующих вещей:
- Пересмотреть модель безопасности вашего приложения. Вы не должны полагаться на «секретные URL» для какой-либо степени реальной безопасности, если вы можете избежать этого.
- Используйте имя ключа и задайте для него длинную случайную строку, которую пользователи не смогут угадать.
И последнее, что может изменить пользователь. Если вы обрабатываете ключи, передавая их db.get
, пользователь может изменить имя вида и заставить вас выбрать другой тип объекта, который вы намеревались. Если у этого вида сущностей есть поля с одинаковыми именами, вы можете делать с сущностью такие вещи (как, например, раскрытие данных из нее), которые вы не намеревались. Вы можете избежать этого, передав вместо этого ключ YourModel.get
, который проверит ключ правильного типа перед извлечением.
Однако все это говорит о том, что лучше всего передать идентификатор или имя ключа. Вы можете извлечь это, вызвав .id()
для ключевого объекта (для идентификатора - .name()
, если вы используете имена ключей), и вы можете восстановить исходный ключ с помощью db.Key.from_path('kind_name', id)
- или просто получить объект напрямую с помощью YourModel.get_by_id
.