@Apogeios

Как грамотно замаскировать поле _id при передаче на UI?

Если в одной бд создать два документа с интервалом времени меньше секунды, то _id последнего это инкремент предшествующего, который отличается как видно только последним символом:

ObjectId("585f695e45a2c61b5c7ca452")
ObjectId("585f695e45a2c61b5c7ca453")

Т.е зная _id последнего мы может "почти точно" знать _id документа который был создан до него.

Допустим, организация ссылок на моем сайте, это вызов документа через явное указание _id (в строке адреса), но мне не хотелось бы что бы человек, всего лишь посмотрев на запрос, мог узнать и получить доступ к документам из этого диапазона _id (авторизация не учитывается).

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

Есть ли встроенный метод в монго, который более интересно придумывает _id или может кто предложить другой алгоритм подхода в организации _id, без лишних проверок и запросов?
  • Вопрос задан
  • 465 просмотров
Решения вопроса 2
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
Допустим, организация ссылок на моем сайте, это вызов документа через явное указание _id (в строке адреса), но мне не хотелось бы что бы человек, всего лишь посмотрев на запрос, мог узнать и получить доступ к документам из этого диапазона _id (авторизация не учитывается).

А не лучше ли тогда, для этих целей использовать не ID, а какое-то отличное от ID значение, генерируемое иным образом, с установкой индекса на оное (для производительности аналогичной той, что будет при использовании ID).

Первое что приходит на ум это назначить свой _id рендомом.

Я не великий спец по монге, но по моему, идея довольно хреновая, в общей сложности.

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

Я бы всё-таки оставил ID в покое и не пытался бы сделать "из палки пистолет". Добавьте новое поле в качестве URL'а документа и записывайте туда хэшированный ID, не думаю, что увеличение объёма документа на 20-40 байт данных, может привести к тотальному краху системы (это как минимум, было бы странно). Ну или, если очень хочется и... и того и другого, используйте механизм "обратимого шифрования", т.е. хэширование - это по сути своей "односторонее шифрование" (если выражаться по простому), хэш нельзя превратить обратно в данные. Используйте обратимое шифрование, например такое. Идею с обратимым шифрованием можно развить и придумать какие-то дополнительные ключи или соль, если хочется прям "совсем страшно зашифроваться"...

P.S. Библиотека для шифрования в примере, - первая что попалась в поиске. Судя по тегам, Вы используете Node.JS, уверен для нее подобных библиотек и алгоритмов должно быть в избытке.
Ответ написан
yarkov
@yarkov
Помог ответ? Отметь решением.
У Монго есть виртуальные поля. Заюзайте их и будет счастье ))
// ПСЕВДОКОДИЩЕ!!!
var ArticleSchema = new Schema({
  title: {
      type: String
  }
});

ArticleSchema
  .virtual('id') // вместо _id
  .get(function() {
    let hash = md5(this.title);
    return encrypt(this._id, hash);
  })
  .set(function (setFullNameTo) {
    // some setter code
  });
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
"почти точно" знать

почти точно взломать, почти точно увидеть секретные секреты.

Тому кто захочет узнать какие-то секретные ссылки в последнюю очередь в голову придёт перебирать цифры в такой строке, потому что изначально видно что это очень длинный набор буквоцифр, который просто так не подобрать.
Только если это упоротый школьник, который вообще ничего не понимает в жизни.

Опять же что получить "почти одинаковые" записи надо добавлять прям вообще одномоментно.
Дальше чем 1 ID соседний вряд ли "переберётся" брутом.
Короче это все Неуловимый Джо.

И если нужна безопасность и защита от чужих глаз - нужно авторизацию проверять.
Ответ написан
@kliss
> мог узнать и получить доступ к документам из этого диапазона _id (авторизация не учитывается)

Вот где проблема, а не в айдишниках. Security by obscurity не работает. Настрой проверку прав и хоть интегерами айдишники передавай.
Ответ написан
edli007
@edli007
full stack, team lead
Apogeios там на самом деле основано на метке времени, но это просто чтобы админы не сказали что на вопрос не ответил.

По твоему вопросу недавно удаленному про 20к, есть идеи, но такие вещи публично не обусуждаються.
Если намерения серьезные, пиши в скайп FenixSumi, обговорим, если теоретическое размышление то сам понимаешь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы