Я в целом согласен с ответом @ 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".Таким образом, размер каждого документа немного выше, и вы используете индекс, который у вас [вероятно] был там в любом случае.