Можно ли превратить объектный идентификатор Монго в строку и использовать его для URL? - PullRequest
4 голосов
/ 03 декабря 2010
document/show?id=4cf8ce8a8aad6957ff00005b

Ответы [ 2 ]

9 голосов
/ 03 декабря 2010

Как правило, я думаю, что вы должны быть осторожны, чтобы выставлять клиенту внутренние компоненты (например, идентификаторы БД). С URL можно легко манипулировать, и пользователь, возможно, имеет доступ к объектам, которые вы не хотите, чтобы он имел.

Специально для MongoDB идентификатор объекта может даже выявить некоторые дополнительные внутренние элементы (см. здесь ), т. Е. Они не полностью случайны. Это тоже может быть проблемой.

Кроме того, я думаю, что нет причин не использовать идентификатор.

7 голосов
/ 12 декабря 2013

Я в целом согласен с ответом @ MartinStettner.Я хотел добавить несколько моментов, в основном уточняя, что он сказал.Да, небольшое количество информации может быть декодировано из ObjectId.Это легко доступно, если кто-то распознает это как ObjectID MongoDB.Два недостатка:

  • Это может позволить кому-то угадать другой действительный ObjectId и запросить этот объект.
  • Может раскрыть информацию о записи (например, дату ее создания)или сервер, который вы не хотели, чтобы кто-то имел.

«Правильное» исправление для первого элемента - реализовать какой-то реальный контроль доступа: 1) пользователь должен войти в систему симя пользователя и пароль, 2) объект связан с этим именем пользователя, 3) приложение обслуживает объекты только для пользователя, которые связаны с этим именем пользователя.

MongoDB не делает этого сам;вам придется полагаться на другие средства.Возможно, ваш фреймворк для веб-приложений и / или какой-то специальный список контроля доступа (который сам может быть в MongoDB).

Но вот «быстрое решение», которое в основном решает обе проблемы: создайте некоторые другие »id "для записи, основанной на большом, случайном числе высокого качества.

Насколько большим должно быть «большое»?128-битное случайное число имеет 3,4 * 10 ^ 38 возможных значений.Так что, если в вашей базе данных есть 10 000 000 объектов, кто-то, угадающий действительное значение, имеет чрезвычайно малую вероятность: 1 из 3,4 * 10 ^ 31.Не достаточно хорош?Используйте 256-битное случайное число ... или выше!

Как представить это число в документе?Вы можете использовать строку (кодирование числа в виде hex или base64) или двоичный тип MongoDB.(Обратитесь к документации по API вашего драйвера, чтобы выяснить, как создать двоичный объект как часть документа.)

Хотя вы можете добавить в документ новое поле для хранения этого документа, вам, вероятно, также понадобитсяиндекс.Таким образом, размер документа больше, и вы тратите больше памяти на этот индекс.Вот что у вас может не быть: просто ИСПОЛЬЗУЙТЕ это "действительно случайный идентификатор" в качестве поля ваших документов "_id".Таким образом, размер каждого документа немного выше, и вы используете индекс, который у вас [вероятно] был там в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...